建议看尚硅谷深度学习视频一、深度学习基本概念和结构二、感知机和激活函数的由来三、激活函数作用作用一: 没有激活函数一万层网络也只等于一层线性回归啥复杂问题都解决不了作用二 决定神经元是否“放电”特征过滤)作用三 压缩数值范围防止“梯度爆炸”思考:激活函数算出来是 0 这个数值就不会被下一层加入计算吗(是的完全不会)插曲一些知识 偏置 b 和激活函数真正放在一起看看它们到底是怎么配合的。四、阶跃函数五、sigmoid六、Tanh函数笔记来自尚硅谷 深度学习 截图一、深度学习基本概念和结构人工神经网络Artificial Neural NetworkANN简称 神经网络NN是一种模仿生物神经网络结构和功能的计算模型。大多数情况下人工神经网络能在外界信息的基础上改变内部结构是一种自适应系统(adaptive system)通俗地讲就是具备学习功能。相邻层的神经元相互连接(图中下一层每个神经元都与上一层所有神经元连接,称为 全连接)每个连接都会有一个 权重。神经元中的信息逐层传递一般称为 前向传播 forward上一层神经元的输出作为下一层神经元的输入二、感知机和激活函数的由来感知器(perceptron)是二分类模型,接受多个信号,输出一个信号.感知机的信号只有01两种取值。重要的事打一遍字不用一直线性下去吧h(x)可以将输入信号的加权总和转换为输出信号,起到激活神经元的作用所以被称为激活函数三、激活函数作用激活函数是连接感知机和神经网络的桥梁在神经网络中起着至关重要的作用。作用一: 没有激活函数一万层网络也只等于一层线性回归啥复杂问题都解决不了如果没有激活函数整个神经网络就等效于单层线性变换不论如何加深层数总是存在与之等效的“无隐藏层的神经网络”。激活函数必须是非线性函数也正是激活函数的存在为神经网络引入了非线性使得神经网络能够学习和表示复杂的非线性关系。作用二 决定神经元是否“放电”特征过滤)现实中大脑的神经元只有当接收到的刺激超过一定阈值时才会“放电”把信号传给下一个神经元。激活函数就是模拟这个机制。它把前一层的加权求和a aa映射成一个“激活程度”。比如大于某个值才把信号传给下一层。作用三 压缩数值范围防止“梯度爆炸”你看图里的a w 1 x 1 w 2 x 2 b a w_1x_1 w_2x_2 baw1x1w2x2b。如果在深层网络里每层算出来的值都越来越大比如变成 1000、10000计算机的浮点数会溢出模型直接崩溃这叫梯度爆炸。激活函数可以把这些无限大的数字“挤压”回一个安全范围比如[ − 1 , 1 ] [-1, 1][−1,1]或[ 0 , ∞ ) [0, \infty)[0,∞)让网络能稳定训练。思考:激活函数算出来是 0 这个数值就不会被下一层加入计算吗(是的完全不会)我们以最经典的激活函数ReLU (Rectified Linear Unit, 线性整流函数)为例。它的公式极简单f ( x ) m a x ( 0 , x ) f(x) max(0, x)f(x)max(0,x)。如果输入x 0 x 0x0输出还是x xx。如果输入x ≤ 0 x \le 0x≤0输出直接强行变成 0。“变成 0”在下一层计算时意味着什么假设下一层的计算是y w 1 ⋅ a 1 w 2 ⋅ a 2 b y w_1 \cdot a_1 w_2 \cdot a_2 byw1⋅a1w2⋅a2b。如果上一层传过来的a 1 a_1a1经过激活函数变成了 0。那么y w 1 ⋅ 0 w 2 ⋅ a 2 b w 2 ⋅ a 2 b y w_1 \cdot 0 w_2 \cdot a_2 b w_2 \cdot a_2 byw1⋅0w2⋅a2bw2⋅a2b你看w 1 w_1w1和a 1 a_1a1直接从公式里消失了。在神经网络和矩阵运算中0 就代表“此路不通”。这就引出了深度学习中极其重要的一种现象1. 产生“稀疏性 (Sparsity)”极度省算力图片里有大量的像素点、一句话里有大量无用的介词它们对最终结果没贡献。ReLU 让这些无用特征直接变成 0。下一层遇到 0 就不用算了大大节省了 GPU 的算力。这种“断舍离”不仅省算力还是让神经网络变得聪明和高效的秘诀2. 强迫网络只关注“重点”抗噪如果输入的是无用的噪声算出来的值大概率小于 0被 ReLU 激活成 0 后等于告诉后面的网络“这全是废话不用管它了”。这极大地提高了模型提取核心特征的效率。3. 避免梯度消失ReLU 的绝活早期的激活函数比如 Sigmoid在输入极大或极小时曲线是平的。曲线平 导数为 0 训练时权重无法更新这叫梯度消失。而 ReLU 只要输入大于 0它的导数永远是 1。这意味着误差可以畅通无阻地传回前面的层极大加速了深层网络的训练。早期的 Transformer 和现在的很多 CNN中间层都在疯狂使用 ReLU 或者它的变体 GELU。那为 0 有啥坏处吗有。如果输入永远小于 0输出永远为 0导数也为 0。那个神经元就“死”了Dead Neuron参数永远无法更新。为了防这个工程师后来发明了Leaky ReLU让小于 0 的部分不是 0而是0.01 x 0.01x0.01x保留一点点微弱信号不让它彻底死掉。插曲一些知识 偏置 b 和激活函数真正放在一起看看它们到底是怎么配合的。真相偏置b bb的作用就是用来“控制”激活函数的结合公式我们把流程排好第一步线性计算a w 1 x 1 w 2 x 2 b a w_1x_1 w_2x_2 baw1x1w2x2b这一步把输入加权求和并加上偏置b bb第二步激活函数y f ( a ) y f(a)yf(a)把算出来的a aa塞进激活函数为什么非要在进激活函数之前加一个b bb呢你想如果没有偏置b bb。那么输入信号x 1 x_1x1和x 2 x_2x2哪怕全等于 0算出来的a aa也是 0。这就意味着当没有输入信号时这个神经元绝对不可能被激活它永远死气沉沉。加了偏置b bb就相当于给神经元设定了一个“门槛或基础活跃度”。我们以ReLU 激活函数公式是f ( a ) m a x ( 0 , a ) f(a) max(0, a)f(a)max(0,a)即负数变0正数保留为例来看看b bb的魔法情况 1假设b bb是一个负数比如b − 5 b -5b−5哪怕你给了输入信号比如w 1 x 1 w 2 x 2 3 w_1x_1 w_2x_2 3w1x1w2x23算出来的a 3 − 5 − 2 a 3 - 5 -2a3−5−2。然后a − 2 a -2a−2进了激活函数ReLU 一看是负数直接把它变成 0。结果这个神经元非常“高冷”它觉得信号太弱了不值得兴奋所以不激活输出 0后面的层就不计算它了。情况 2假设b bb是一个正数比如b 5 b 5b5哪怕你根本没给任何输入信号输入全是 0算出来的a 0 5 5 a 0 5 5a055。然后a 5 a 5a5进了激活函数ReLU 一看是正数原样输出 5。结果这个神经元非常“敏感”一点点风吹草动或者没动静它也会被激活。情况 3训练过程中网络在调整b bb网络在“学习”时如果发现某个神经元太容易激活了老是输出非 0 值导致模型预测错误反向传播算法就会把它的b bb调小一点往负数方向调让它冷静一下如果发现它太死板了总是输出 0啥特征也学不到就会把b bb调大一点让它更容易被激活。记住一句话b 是给激活函数打辅助的它决定了神经元被激活的难易程度四、阶跃函数#阶跃函数(输入是一个标量)importnumpyasnpdefstep_function0(x):ifx0:return1else:return0defstep_function(x):returnnp.array(x0,dtypeint)if__name____main__:xnp.array([0,1,2,3,4,5,-1,-2,-3,-4,-5])print(step_function(x))五、sigmoid下面是函数和导函数图片从第二张导函数能看出来再等0是到了拐点靠近0是开始急剧增大过了拐点开始慢慢增大减速导函数下降不代表原函数就会下降。只要导函数的值也就是斜率还是正数原函数就一直在上升。核心概念导函数的“正负”决定原函数的“升降”导函数 (f’(x) 0)在 x 轴上方原函数 f(x) 就在上升。导函数 (f’(x) 0)在 x 轴下方原函数 f(x) 就在下降。你看右图Sigmoid 的导函数图像它在 x0之后确实开始下降了从最高点 0.25 往下掉。但是它下降归下降它依然在 x 轴的上方数值依然是正数 所以原函数 f(x) 依然在增加只是增加的速度变慢了。S i g m o i d SigmoidSigmoid也叫 Logistic 函数是平滑的、可微的能将任意输入映射到区间(0,1)常用于二分类的输出层。但因其涉及指数运算计算量相对较高。S i g m o i d SigmoidSigmoid的输入在[-6,6]之外时其输出值变化很小可能导致信息丢失。S i g m o i d SigmoidSigmoid的输出并非以 0 为中心其输出值均0导致后续层的输入始终为正可能影响后续梯度更新方向。S i g m o i d SigmoidSigmoid的导数范围为(0,0.25)梯度较小。当输入在[-6,6]之外时导数接近 0此时网络参数的更新将会极其缓慢。使用 Sigmoid 作为激活函数可能出现梯度消失在逐层反向传播时梯度会呈指数级衰减。别的不说 先搞定求导回忆基础复合求导s i g m o i d sigmoidsigmoid求导过程σ ( x ) \sigma(x)σ(x)和 f(x) 一个意思所以下面ai用σ ( x ) \sigma(x)σ(x)计算求导σ ( x ) \sigma(x)σ(x)1 1 e − x \frac{1}{1 e^{-x}}1e−x1代码(包含测试阶跃函数)# Sigmoid函数defsigmoid(x):return1/(1np.exp(-x))if__name____main__:xnp.array([0,1,2,3,4,5,-1,-2,-3,-4,-5])print(step_function(x))print(sigmoid(x))六、Tanh函数Tanh函数就是sigmoid的平移和缩放原来sigmoid 的值是 0到1这里2 sigmoid(2x) 的值是 0到2又减去1 所以值变成-1 到 1importnumpyasnp xnp.array([0,1,2,3,4,5,-1,-2,-3,-4,-5])np.tanh(x)
阅读完成 · 觉得有帮助?