神经网络学习笔记

基础

简单的单层感知机

模型:yj=f(iwixiθj)y_j=f(\sum_iw_ix_i-\theta_j)ff 为激活函数,ww 为权重,xx 为输入,θ\theta 为阈值,yy 为输出

学习规则:Δwi=η(yy^)xi\Delta{w_i}=\eta(y-\hat{y})x_iy^\hat{y} 为当前输出,η\eta 为学习率(一般极小)

算了,自己看西瓜书 P101 5.3 误差逆传播算法 吧

流程

输入:训练集D={(xk,yk)}k=1mD=\{(x_k,y_k)\}^m_{k=1},学习率η\eta

过程:

  1. 在 (0, 1) 范围內随机初始化网络中所有连接权和阈值
  2. repeat
    1. for all(xk,yk)D(x_k,y_k)\in{D} do
      1. 根据当前参数和yj=f(iwixiθj)y_j=f(\sum_iw_ix_i-\theta_j) 计算当前样本输出y^\hat{y}
      2. 计算输出层神经元梯度项gj=y^jk(1y^jk)(yjky^jk)g_j=\hat{y}^k_j(1-\hat{y}^k_j)(y^k_j-\hat{y}^k_j)
      3. 计算隐藏层神经元梯度项eh=bh(1bh)j=1lwhjgje_h=b_h(1-b_h)\sum^l_{j=1}w_{hj}g_j
      4. 计算连接权增量Δwhj=ηgjbh\Delta{w_{hj}}=\eta{g_j}b_hΔvih=ηehxi\Delta{v_{ih}}=\eta{e_h}x_i;以及阈值增量Δθj=ηgj\Delta{\theta_j}=-\eta{g_j}Δγh=ηeh\Delta{\gamma_h}=-\eta{e_h}
    2. end for
  3. until 达到停止调节

输出:连接权与阈值确定的多层前馈神经网络

避免陷入局部极小

  1. 用多种初值训练网络,取其中误差最小的解
  2. 使用模拟退火,即在每一步都以一定概率接受比当前解更差的结果。这一概率会逐步减小
  3. 使用随机梯度下降,即在计算梯度时加入了随机因素,使得陷入局部极小时也可能获得非零梯度
  4. 遗传算法(什么鬼

模拟退火是 是否接收这个结果的时候加入随机,随机梯度是 计算梯度的时候选取随机的部分样本而非所有样本。随机梯度下降实际上主要用于加快计算

常用结论

学习率η(0,1)\eta\in(0,1) 控制算法每轮迭代的更新步长,过大容易振荡,过小则收敛慢。

缓解过拟合:

  1. 早停:启用验证集,当训练集误差降低但测试集误差升高时停止训练
  2. 正则化:让误差目标函数加上一个用于描述网络复杂度的函数,例如连接权和阈值的平方和,这将使得训练更倾向于较小的连接权和阈值,让输出更光滑

代码相关

pytroch中ctx和self的区别