手刻 Deep Learning -第壹章 -PyTorch教学-激励函数与感知机入门(上)

news2024/11/18 20:35:41

一、前言

        本文接续前篇教学 Pytorch 与线性回归 ,本文着重在 Activation Function ( 中文称 激励函数 ),我们会介绍激励函数 (也有人称 激活函数? 激发函数? ) 为什么会有用,还有通过示例来探讨/实作(本文介绍常用的 ReLU, Tanh, Sigmoid, Softmax )

        阅读本文需要有矩阵计算的知识,还有知道线性回归的原理
另外我们也使用 Pytorch

        本文希望透过生活中的范例,白话文的精神,让各位了解 Deep Learning/Machine Learning 中的激励函数 ( Activation Function )
了解激励函数,其实就是往 Deep Learning 更迈进了一步

二、激励函数(Activation Function) 为什么会有用

网络上大家应该看过什么激励函数解决线性,非线性问题,这些都是抽象的老生常谈,不是数学领域的人应该很难理解,但其实他的概念很简单:

我相信编程程序的人,一定都有用过if这个语法
而激励函数的精神,其实就是用数学的形式来表达if else语法

核心概念就是这么简单
我们通过大量的 if else 去编织(矩阵计算)出结果,这就是为什么需要激励函数,用这种方法配合微分就可以解决问题

三、激励函数 — 生活中的概念范例

我们来看一个简单的问题:传统电饭锅 / 电热水壶

電鍋示意圖,非當事電鍋

傳統電鍋/熱水壺是溫度達到一個程度後就會跳開 ( 燒開水 ),這就是激勵函數的概念
例如:
- 溫度 130 度 以下保持加熱 ( switch = 0 )
- 超過 130 度的時候跳停 (switch = 1 )

        溫度在 130 度的時候跳停 ( switch 1 )

        我們來看看程式怎麼寫

def check(t):
    if t > 130:
        return 1
    return 0

        看到我們使用 if 來解決問題了嗎?

四、激勵函數之 Sigmoid

        數學上,我們可以透過函數達到這種效果,我們來看 sigmoid 這個範例;關於 Sigmoid 的計算公式有興趣可以看看 wiki ,我們這邊主要說明他的概念為什麽有效

簡單的說,Sigmoid 是透過計算讓他的範圍維持在於 0 到 1 之間

先看 Pytorch 程式碼繪製的 sigmoid activation function

x = torch.arange(-10., 10., step=0.01)
plt.plot(x, torch.sigmoid(x))
sigmoid 激励函数

        解说:

  • torch.arange 是产生一个 -10 ... 10 的 array ( tensor )
  • torch.sigmoid 就是 torch 的 sigmoid 函数
  • 我们把它绘制成图表来看

        可以看到在不同的 X 范围,最多输出 ( y) 就是 0~1 之间,就算是 -100000 到 100000 也是 ( 如下图)

sigmoid 激励函数,不管 x 范围多少,就是输出 0–1 之间

        看起来是不是和电饭锅跳停的图片有八成像?
        那么问题来了,怎么套用在我们的电饭锅问题上?

五、激励函数与线性回归组合

我们这边,假设 x 是温度,是不是只要有办法让 sigmoid(x) 在 x 大于 130的时候输出 1 就好 ?

回到线性归公式, y = ax + b
所以我们要改写成 y = sigmoid(ax + b)
(a 和 b 是我们的变量 )
我们写成 Pytorch 代码来看,套用之前文章讲到的自动微分
( 后面有完整可执行示例,以下是片段代码)

a = torch.rand(1, requires_grad=True)
b = torch.rand(1, requires_grad=True)
def forward(t):
    return torch.sigmoid( a * t + b )
  • 这边我们要使用自动导数 (Auto grad ) 来找出正确的 a, b ,所以 requires_grad=True
  • 我们这边 forward(t) 使用 t ,避免变量名称与 x 混淆

先看我们没有训练前的结果

# 溫度範圍 0 ~ 200 度
x = torch.arange(0, 200, step=0.1)
# y_p 是 y predict, 我們預測的 y
y_p = forward(x).detach().numpy()  # .detach().numpy() 是轉換成 numpy
# 繪圖
plt.plot(x, y_p)
未經訓練的輸出結果

        還沒訓練以前,看起來一點也不像是有用的東西
        現在我們開始訓練,這之前,先準備一下正確答案 ( y 為正確答案)

def check(t):
    if t > 130:
        return 1
    return 0
y = torch.tensor([check(t) for t in x]).float()

        註 1: torch.tensor 是將 python array 變成 torch 的 array ( tensor ),類似於 np.array
        註 2: 因為我們計算都是用 float, 所以要轉成 torch 的 float

        然後準備一下 優化器 和 損失函數 ( Loss function )
( 優化器我們使用 Adam ,損失函數我們先用 BCELoss, 這部分有空再另寫文章介紹… )

# 準備變數
a = torch.rand(1, requires_grad=True)
b = torch.rand(1, requires_grad=True)
# 定義計算
def forward(t):
    # y = sigmoid(ax + b)
    return torch.sigmoid(a * t + b)
# 優化器
opt = torch.optim.Adam([a, b], lr=0.05)
# 損失函數
loss_func = torch.nn.BCELoss()

開始訓練的程式碼

for _ in range(10000):
    y_p = forward(x)          # 預測 y
    loss = loss_func(y_p, y)  # 計算誤差
    opt.zero_grad()  # 導數重置
    loss.backward()  # 反向傳導
    opt.step()       # 優化器修正

我們整理一下,完整可執行範例 :

import numpy as np
import torch
import matplotlib.pyplot as plt

# 溫度範圍
x = torch.arange(0, 200, step=0.1)

# 我們先做出正確答案
def check(t):
    if t > 130:
        return 1
    return 0
y = torch.tensor([check(t) for t in x]).float()
plt.figure(figsize=(30, 10))
plt.subplot(1, 2, 1)
plt.plot(x, y)

# 準備變數
a = torch.rand(1, requires_grad=True)
b = torch.rand(1, requires_grad=True)

# 定義計算
def forward(t):
    # y = sigmoid(ax + b)
    return torch.sigmoid(a * t + b)

# 優化器
opt = torch.optim.Adam([a, b], lr=0.05)

# 損失函數
loss_func = torch.nn.BCELoss()

# 開始訓練
for _ in range(10000):
    y_p = forward(x)          # 預測 y
    loss = loss_func(y_p, y)  # 計算誤差
    opt.zero_grad()  # 導數重置
    loss.backward()  # 反向傳導
    opt.step()       # 優化器修正
    
plt.subplot(1, 2, 2)
y_p = forward(x).detach().numpy()
plt.plot(x, y_p)

得到的如下圖

訓練過的 sigmoid 結果比較

        左邊 ( 正確答案 ) 和 右邊 ( 預測結果 ) 看起來有八成像了,用 y 約 0.5 做分界點, 落在 130 度左右的範圍

        以上的範例中,我們從來沒有真正的去管 a, b 的實際數值多少,這就是 Machine Learning 厲害的地方,他會自己去找到答案
( 我們一直是用 y = ax + b 這個公式,上面範例也是一種最簡單的感知機 )

六、激勵函數之 Sigmoid / ReLU / Tanh / Softmax 比較

        其實 relu, tanh, softmax 各有自己的應用場景,本文篇幅有限,我們無法在本篇說明實際的應用( 實際應用會於日後文章再說明)

6.1 - ReLU, Tanh 和 Sigmoid 簡介

ReLU, Tanh 和 Sigmoid 其實差別就是輸出的範圍

  • Sigmoid:上面提過,數字越大(正數),越趨近於 1,數字越小(負數),越趨近於 0,主要用在 0 / 1 的判斷場景,目前比較多的應用是放在輸出層 ( Deep Learning )
  • ReLU:數字大於 0 ,就會是那個數字,如果小於 0 就會是 0 ,用程式碼來看就是 “if x > 0 then x else 0" 又或是 max(x, 0)
    因為這個特性適合用在線性回歸的問題或是保留特徵值傳遞 ( Deep Learning )
  • Tanh :和 Sigmoid 類似,但它的輸出範圍從 0 變成 -1,所以是 -1 與 1,不少場合使用 Tanh 會有更高的效率 ( 因為他比 Sigmoid 有更大的範圍可以傳遞資訊 )

看文字敘述不清楚的話,可以看看輸出範圍圖 ( 我們都假設 x 是 -5 ~ 5)

從左至右為 Sigmoid, ReLU, Tanh

6.2 - Softmax 簡介

        其中 Softmax 有些特別,他不是一個單純的計算,他適用於分類
( 例如物件辨識,手寫辨識… )

        白話文的說,他是用來計算機率的,他會將輸入的數字給出對應的機率,該機率總和就是就是 1 ( 意即 100% )

        例如,我們常常看到的物件辨識範例,可能會有
- 貓 70%
- 狗 25%
- 馬 5%
        這個 0.70 + 0.25 + 0.05 = 1.00 就是 softmax 輸出的總和

        他不管輸入的數值(x) 範圍是多少,就是會給出一個對應的 x 機率範圍
大家可以跑看看以下程式碼

x = torch.randn(30)
plt.stem(torch.softmax(x, dim=0))
print('總和:', torch.sum(torch.softmax(x, dim=0)))

        類似下圖的東西 ( 因為是亂數,所以每次結果都不會相同 )
總和會是: tensor(1.0000)

        Softmax 会告诉我们哪个 x 发生的机率更大
        而那个 x 怎么来的,我们可以透过 Machine Learning 找出来
        所以用在图像识别方面的输出层很常见

七、小结 

        本文是激励函数的简介上篇,以上是很常用的激励函数 ( Activation Funcitons )

往后我们的 Deep Learning 基本上都脱离不了他们的概念,下篇我们会来看实际范例的应用 ( 下篇等本人有空再写.... )

        另外激励函数使用需要注意的部分,有兴趣的读者可以多多研究

  • 输出范围与传递信息问题
  • 微分问题
  • 选择正确的输出函数

    Seachaos

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 06 之面向对象基础

😀前言 在日常编程和软件开发中,我们通常会遇到各种各样的问题,其中很多问题都可以通过面向对象的程序设计方法来解决。面向对象编程不仅可以使代码更加组织化和系统化,而且还可以提高代码的重用性和可维护性。 . 在本教程中&…

一个工位的演讲

前几天,知乎官方制作了一个视频,感觉这个视频非常不错,推荐给大家看看。 这个短片很有创意,而且,内容也很丰富。 为什么说这个短片很有创意呢?因为它是从一个工位的角度切入的,所谓铁打的工位&a…

基于matlab实现的电力系统稳定性分析摆幅曲线代码

完整程序: clear; clc; t 0; tf 0; tfl 0.5; tc 0.5; % tc 0.05, 0.125, 0.5 sec for 2.5 cycles, 6.25 cycles & 25 cycles resp ts 0.05; m 2.52 / (180 * 50); i 2; dt 21.64 * pi / 180; ddt 0; time(1) 0; ang(1) 21.64; pm 0.9; pm1 2.44;…

解锁大数据宝藏:使用AI预测未来趋势的新方法

文章目录 大数据的价值传统方法与AI的优势使用AI预测未来趋势的新方法1. 时间序列分析2. 自然语言处理(NLP)3. 预测市场趋势 应用前景与挑战应用前景挑战和限制 结论 🎉欢迎来到AIGC人工智能专栏~解锁大数据宝藏:使用AI预测未来趋…

软件设计师考试学习1

前言 计算机组成原理及体系结构 数据的表示 进制的转换 原码反码补码移码 最高位是符号位,负数符号位为1 反码补码正数和原码一样,负数有区别 反码符号位不动,其他位置取反 补码在反码基础上加1 移码是将补码的符号为取反 在原码和反码中…

Sqlserver如何调试存储过程

前提:需要使用Sql Server Managerment Studio 工具进行调试。 步骤: 1.选择存储过程,右键选择“执行存储过程”。操作过后,会生成一个调用存储过程的代码块。 2.以编辑模式打开所以需要调试的存储过程。 3.点击调试按钮进行调…

k8s集群使用ingress转发grafana服务

文章目录 前言一、思路二、grafana准备1. grafana-configmap.yaml2. grafana.yaml 三、ingress准备1. ingress.yaml2. grafana-externalname.yaml3. ingress-nginx-controller 四、 本机host文件准备五、访问测试 前言 在k8s集群中,使用ingress服务转发grafana的页…

苹果是真牛,数据线的钱要赚,换电池钱也要赚,贪婪成性

iPhone15发布会是苹果当前的热点,发布会结束后苹果又传出了一个消息,进一步提高更换电池的价格,显示出苹果意图进一步割韭菜,提升利润,这就有点贪婪成性了吧? 据了解 iPhone 7、8 及 SE 系列由 528 元涨至 …

商淘云八周年 与实体店业务共发展

引言:商淘云主要从事电商平台、B2B订货系统、供应链管理系统的开发和搭建,目前服务的客户有:中商北斗供应链管理集团有限公司、奥克斯物业、苏州广电总台、中国平安、南方新闻网等。 随着时间的流淌,市场不断发展,商淘…

【多线程案例】阻塞式队列

1. 什么是阻塞式队列 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素. 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往…

性能工程落地的4个阶段

性能工程按照不同的内容和目的划分为4个阶段,分别是线下单系统压测分析阶段、线下全链路压测分析阶段、生产只读业务压测及容量评估阶段、生产读写业务全链路压测及容量评估阶段。(也可以理解为一个企业性能测试体系的发展阶段) 线下单系统压测分析阶段 针对单系统的性能…

第71步 时间序列建模实战:ARIMA建模(Python)

基于WIN10的64位系统演示 一、写在前面 这一期,我们使用Python进行SARIMA模型的构建。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever wi…

LeetCode算法动态规划—剑指 Offer 10- II. 青蛙跳台阶问题

目录 剑指 Offer 10- II. 青蛙跳台阶问题 题解: 代码: 运行结果:​编辑 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007&#xff…

实现按钮悬停动画

知识点与技巧 伪元素 使用伪元素来作为按钮悬停效果动画展示的元素 z-index 的使用技巧 使用z-index属性来控制按钮和伪元素的层次关系 transform、transition 复习 使用transform、transition两个属性来实现动画的展示 按钮边框动画 切换效果 核心代码 .btn.btn-border-…

Python语言开发环境安装

视频版教程 Python3零基础7天入门实战视频教程 首先去Python官网下载Python安装包 https://www.python.org/ 目前最新版本:Python 3.11.4 直接点击下载。(建议用迅雷下载,速度快) 双击安装包进行Python安装。 勾选下 Add pytho…

3D生成式AI模型、应用与工具大全

当谈到技术炒作时,人工智能正在超越虚拟世界,吸引世界各地企业和消费者的注意力。 但人工智能可以进一步增强虚拟世界,至少在某种意义上:资产创造。 AI 有潜力扩大用于虚拟环境的 3D 资产的创建。 推荐:用 NSDT编辑器…

二叉树(堆)

堆的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。 大堆:任何父亲≥孩子 小堆:任何父亲≤孩子 接下来,我们要做的便是对堆进行增加和删除: 首先是增加操作&#xff0c…

【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:438. 找到字符串中所有字母异位词 - 力扣(Leetcode) 这道题很好理解,就是找出从不同位置开始的所有异位词。 2. 算法原理 那我们该如…

下载安装python的详细步骤-2023

目录 一、介绍 二、下载 三、安装 四、测试 一、介绍 读者手册(必读)_csdn文章评分怎么看_云边的快乐猫的博客-CSDN博客 Python 是一种高级编程语言,具有简洁、易读、易学的特点。它由Guido van Rossum于1989年首次发布,并于1…

无涯教程-JavaScript - ACOTH函数

描述 ACOTH函数返回数字的反双曲余切。 语法 ACOTH (number)争论 Argument描述Required/OptionalNumberThe absolute value of Number must be greater than 1. i.e., Number must be must be less than -1 or greater than 1.Required Notes 用于计算双曲反余切的方程为-…