《Python神经网络编程》阅读笔记

这篇笔记探讨了神经网络的工作原理,包括输入输出、模型迭代、误差计算和权重更新。介绍了线性模型和激活函数如Sigmoid的重要性,以及在神经网络中权重如何通过梯度下降法进行学习和调整。学习率的概念被提出,用于控制权重更新的幅度,防止过拟合。此外,还讨论了反向传播误差和权重更新的矩阵运算,以及解决饱和和零值信号问题的策略。
摘要由CSDN通过智能技术生成

《Python神经网络编程》阅读笔记

神经网络如何工作

  • 所有有用的计算机系统都有一个输入和一个输出,并在输入和输出之间进行某种类型的计算,神经网络也是如此

  • 当不能精确知道某些事情是如何运作的时候,我们可以尝试使用模型来估计其运作方式,模型中包括了我们可以调整的参数。最简单的尝试是使用线性函数作为模型,并使用可调节的梯度值作为参数

  • 改进模型的一种方式是,基于模型和已知真实示例之间的比较,得到模型偏移的误差值,进行参数的调整。一些人将这种方式称为迭代,意为持续的,一点点改进答案

  • 误差值=期望目标值-实际输出值

  • 我们的目标是找到一种可以重复的方法,也就是使用一系列的计算机指令来达到目标。这一系列指令就是算法-algorithm

  • 如果使用朴素的调整方法,即仅考虑误差值对训练数据样本进行改进,那么我们得到的结果是,最终改进的直线和最后一次训练样本非常匹配,而抛弃了先前训练样本的学习结果。为了解决这个问题,应当进行适度改进(moderate),也就是不使得改进过于激烈,每次变化采用 Δ A \Delta A ΔA,而是采用他的几分之一的一个变化值。适度更新方法可以使得错误或者噪声得到调解和缓和

  • 在改进公式中可以添加一个调节系数 L L L,可称为学习率(learning rate) Δ A = L ( E / x ) \Delta A = L(E/x) ΔA=L(E/x)

  • 简单线性分类器的一个主要限制是:如果不能用一条直线把根本性问题划分开来,那么简单的分类器是没有用处的。比如对于布尔函数XOR(只有在输入A或者B仅有一个为真但两个输入不同时为真的情况下输出为真),不能使用一条单一的直线成功划分输出为真和输出为假,也就是说,一个简单的线性分类器没有办法学习到布尔XOR函数

  • 可以使用多个线性分类器来划分由单一直线无法分离的数据

  • 神经元不会立即反应,而是会抑制输入,直到输入增强。也就是说,神经元不希望传递微小的噪声信号,而是传递有意识的明显信号/只有输入超过了阈值,才会产生输出信号

  • 在数学上,很多激活函数可以达到这样的效果,比如阶跃函数
    在这里插入图片描述

  • 可以改进为S函数(sigmoid function),这样平滑的函数更接近现实。S函数有时候也称为逻辑函数 y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+ex1
    在这里插入图片描述

  • 神经元的树突收集电信号,将其组合形成更强的电信号,如果信号足够强,超过了阈值,神经元就会发射信号,沿着轴突到达终端,将信号传递给下一个神经元的树突。每个神经元接收来自其之前多个神经元的输入,如果神经元被激发了,也会同时提供信号给更多的神经元

  • 将这种自然形式复制为人造模型的一种方法是构建多层神经元,每一层的神经元都与前后层的神经元互相连接

  • 计算神经网络时,对于每一层每个节点,需要计算所有组合信号的组合,乘以正确的权重,应用激活函数。使用矩阵可以帮助压缩这些计算,把它变成一个简单的缩写形式

  • 如果将矩阵中的数据换成对神经网络更有意义的单词,比如第一个矩阵包含两层节点之间的权重,第二个矩阵包含第一层输入层的信号,通过两个矩阵相乘,我们得到的答案是输入到第二层节点组合调节后的信号 [ W 1 , 1 W 2 , 1 W 1 , 2 W 2 , 2 ] [ i n p u t 1 i n p u t 2 ] = [ ( i n p u t 1 ∗ W 1 , 1 ) + ( i n p u t 2 ∗ W 2 , 1 ) ( i n p u t 1 ∗ W 1 , 2 ) + ( i n p u t 2 ∗ W 2 , 2 ) ] [ \begin{matrix} W_{1,1} & W_{2,1} \\ W_{1,2} &W_{2,2} \end{matrix} ][\begin{matrix} input_1 \\ input_2 \end{matrix}] = [\begin{matrix} (input_1 * W_{1,1})+(input_2*W_{2,1}) \\ (input_1 * W_{1,2})+(input_2*W_{2,2}) \end{matrix}] [W1,1W1,2W2,1W2,2][input1input2]=[(input1W1,1)+(input2W2,1)(input1W1,2)+(input2W2,2)] 这个值就是应用S函数之前的x的值

  • 在神经网络中,可以使用矩阵乘法表示所有计算,计算出组合调节后的信号x,输入到第二层的节点中,表示为 X = W ⋅ I X=W \cdot I X=WI,此处 W W W是权重矩阵, I I I是输入矩阵, X X X是组合调节后的信号,即输入到第二层的结果矩阵

  • 针对矩阵X的每个单独元素应用S函数 y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+ex1

  • 激活函数只是简单的应用阈值,使反应变得像是在生物神经元中观察到的行为,因此来自第二层的最终输出是 O = s i g m o i d ( X ) O=sigmoid(X) O=sigmoid(X) O O O代表矩阵,这个矩阵包含了来自神经网络的最后一层中的所有输出

  • 神经网络中第一层为输入层,最后一层为输出层,中间层我们称之为隐藏层

  • 不管有多少层神经网络,都应当一视同仁,即组合输入信号,应用这些链接权重调节输入信号,应用激活函数生成这些层的输出信号。

  • 在得到了最终输出层的输出信号后,下一步是将神经网络的输出值与训练样本中的输出值进行比较,计算输出误差,使用误差值来调节神经网络本身,进而改进神经网络的输出值

  • 神经网络通过调整链接权重进行学习,这种方法由误差引导,误差就是训练数据所给出的正确答案和实际输出之间的差值

  • 当输入和误差是多个节点共同作用的结果时,有两种思想来更新链接权重。一种思想就是在所有造成误差的节点中平分误差,另一种思想是不等分误差,为较大链接权重的链接分配更多的误差,这是因为这些链接对造成误差的贡献较大

  • 在神经网络中,我们在两件事情上使用了权重。1.在神经网络中使用权重,将信号从输入向前传播到输出层。2.使用权重,将误差从输出向后传播到网络中,我们称这种方法为反向传播

  • 使用矩阵乘法计算方向传播误差时,计算的初始点是在神经网络最终输出层中出现的误差。以输出层仅有两个节点为例 e r r o r o u t p u t = [ e 1 e 2 ] error_{output}=[ \begin{matrix}e_1\\ e_2 \end{matrix} ] erroroutput=[e1e2]在输出层中,有两条路径对隐藏层第一个节点的误差做出了"贡献",有误差信号 e 1 ∗ w 1 , 1 / ( w 1 , 1 + w 2 , 1 ) e_1*w_{1,1}/(w_{1,1}+w_{2,1}) e1w1,1/(w1,1+w2,1) e 2 ∗ w 1 , 2 / ( w 1 , 2 + w 2 , 2 ) e_2*w_{1,2}/(w_{1,2}+w_{2,2}) e2w1,2/(w1,2+w2,2),因此可以得到下列隐藏层矩阵 e r r o r h i d d e n = [ w 1 , 1 w 1 , 1 + w 2 , 1 w 1 , 2 w 1 , 2 + w 2 , 2 w 2 , 1 w 2 , 1 + w 1 , 1 w 2 , 2 w 2 , 2 + w 1 , 2 ] ⋅ [ e 1 e 2 ] error_{hidden}=[\begin{matrix}\frac{w_{1,1}}{w_{1,1}+w_{2,1}} & \frac{w_{1,2}}{w_{1,2}+w_{2,2}} \\ \frac{w_{2,1}}{w_{2,1}+w_{1,1}} & \frac{w_{2,2}}{w_{2,2}+w_{1,2}} \end{matrix}] \cdot [ \begin{matrix}e_1\\ e_2 \end{matrix} ] errorhidden=[w1,1+w2,1w1,1w2,1+w1,1w2,1w1,2+w2,2w1,2w2,2+w1,2w2,2][e1e2]这些分数的分母是一种归一化因子,如果忽略这个因子可以获得更简单的表示 e r r o r h i d d e n = [ w 1 , 1 w 1 , 2 w 2 , 1 w 2 , 2 ] ⋅ [ e 1 e 2 ] error_{hidden}=[\begin{matrix}w_{1,1} & w_{1,2} \\ w_{2,1} &w_{2,2} \end{matrix}] \cdot [ \begin{matrix}e_1\\ e_2 \end{matrix} ] errorhidden=[w1,1w2,1w1,2w2,2][e1e2]可以看出这个权重矩阵是之前权重矩阵的转置,记为 w T w^T wT

  • 无论网络规模的大小,使用转置矩阵都可以简洁的表达反向传播误差,这样能保证前项馈送信号和反向传播误差都可以使用矩阵计算来变得高校

事实上如何更新权重

  • 梯度下降法(gradient descent)是求解函数最小值的一种很好的方法,当函数非常复杂困难并且不能轻易使用代数求解函数的时候,梯度下降法能够发挥很好的作用。当函数有很多参数的时候,梯度下降法依然适用
  • 梯度下降法具有弹性,可以容忍不完善的数据
  • 梯度下降法使用步进的方式接近答案,一点点改进解,可能无法给出精确解,所以可以使用更小的步子朝着最值的方向改变,不断优化答案直到对精度满意为止
  • 不断改变步子大小避免微调,这样可以避免在最小值的地方来回反弹。如果调节步长,与梯度的大小成比例,那么在接近最小值的时候,可以采用小补偿。这一假设的基础是,接近最小值时,斜率也变得平缓了,针对大多数光滑的连续函数,这个假设是合适的,但是对于有些突然变化的锯齿函数而言,也就是存在间断点,这不是一个合适的假设
  • 我们往相反的梯度方向增加x值,正梯度意味着减少x,负梯度意味着增加x
  • 针对维度较大的复杂函数,为了避免终止于错误的函数最小值,我们会选择不同的初始点并多次训练神经网络,确保并不总是终止于错误的山谷,在神经网络中选择不同的起始参数意味着选择不同的起始链接权重
  • 误差的计算有很多中选择,一般不选择(目标值-实际值),因为这样可能会导致误差相互抵消;不使用|目标值-实际值|,因为斜率在最小值附近不是连续的,这可能会导致在V形山谷附近来回跳动,在这种情况下即使接近了最小值,斜率也不会变的更小,因此步长也不会变的更小,这可能导致超调的风险;通常使用差的平方,即 ( 目 标 值 − 实 际 值 ) 2 (目标值-实际值)^2 2,使用误差的平方,可以很容易代数计算出梯度下降的斜率;误差函数是平滑的,这可以使得梯度下降法很好地发挥作用;越接近最小值,梯度越小,这意味着如果使用这个函数调节步长,超调的风险就会变得比较小
  • 节点的输出只取决于所连接的链接,也就是取决于链接权重,更新后的权重 w j , k w_{j,k} wj,k是由刚刚得到误差斜率取反来调整就得权重而得到的,如果斜率为正,希望减小权重,如果斜率为负,希望增加权重(要对斜率取反) n e w w j , k = o l d w j , k − α ⋅ ∂ E ∂ W j . k new w_{j,k} = old w_{j,k} - \alpha \cdot \frac{\partial E}{\partial W_{j.k}} newwj,k=oldwj,kαWj.kE
  • α \alpha α这个因子可以调节变化的强度,确保不会超调,我们通常称这个因子为学习率
  • 如果输入输出和初始权重数据的准备与网络设计和实际求解问题不匹配,神经网络可能不能很好的工作
  • 一个常见的问题是饱和,大信号(通常由大权重带来)导致了应用在信号上的激活函数的斜率变得非常平缓,这降低了神经网络学习到更好权重的能力
  • 零值信号或者零值权重也可以使得网络丧尸学习更好权重的能力
  • 内部 链接的权重应该是随机的,值较小但避免零值。如果节点的 传入链接较多,可以减少这些权重的大小
  • 输出应当在激活函数能够生成 的值的范围内。逻辑S函数是不可能生成小于等于0或者大于等于1的值。将训练目标值设置在有效的范围之外将会驱使产生越来越大的权重而导致网络饱和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值