神经网络
线性回归(单层回归问题)
把
X
c
p
2
X_{cp}^2
Xcp2看作一个特征,则还是线性模型。
逻辑回归(单层二分类问题)
函数集
sigmoid 函数:
- 定义
- 为什么是sigmoid?
从生成模型推出;广义线性模型解释(太难了!找时间再看)
损失函数(cross entropy)
cross entropy
- 定义
- 为什么是cross entropy?不用均方差loss?
- 从概率生成模型角度
最大化似然函数,有:
- 交叉熵损失角度 为了使得求得分布与实际分布之间的交叉熵最小(两个分布相近)
而服从伯努利分布(0-1分布)的两个分布间的交叉熵形式就是cross-entropy loss。分布如下:
带入上面交叉熵的公式就可以得到二分类条件下的cross-entropy loss。
- 为啥不用square error了?
交叉熵的损失函数只和分类正确的预测结果有关系,而MSE的损失函数还和错误的分类有关系,该分类函数除了让正确的分类尽量变大,还会让错误的分类变得平均,但实际在分类问题中这个调整是没有必要的
如果是交叉熵,距离target越远,微分值就越大,就可以做到距离target越远,更新参数越快。而平方误差在距离target很远的时候,微分值非常小,会造成移动的速度非常慢
多分类
softmax+交叉熵损失:
- 分子 保证概率为正数
- 分母 保证各类概率求和=1
梯度下降(Gradient Descent)
定义
梯度:函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。
说人话! 梯度的方向是函数变化速度最快的方向
由泰勒公式推导:
- 梯度下降可能存在的问题:
1.陷入局部最小值(local minimum)
2.陷入鞍点(saddle point)
3.在偏导数很小时可能就结束了(plateau)
SGD(Stochastic Gradient Descent)随机梯度下降
在线能够实时计算->一次一个样本
->梯度震荡-> mini-batch 训练
极值点、驻点、鞍点、拐点
极值点:函数从递增变换到递减,或者从递减变换到递增的点,不一定可导
驻点:函数的一阶导数为零
拐点:函数f(x)的凹凸弧分界点,不一定可导,如果可导二阶导为0
鞍点:不是局部最大/小值的驻点。函数在此点一阶导数为零,但该点是某一方向上的函数极大值点,在另一方向上是函数极小值点。
逻辑回归与线性回归差别
LR在线性回归的实数范围输出值上施加sigmoid函数将值收敛到0~1范围, 其目标函数也因此从差平方和函数变为对数损失函数, 以提供最优化所需导数(sigmoid函数是softmax函数的二元特例, 其导数均为函数值的f*(1-f)形式)。请注意, LR往往是解决二元0/1分类问题的, 只是它和线性回归耦合太紧, 不自觉也冠了个回归的名字(马甲无处不在). 若要求多元分类,就要把sigmoid换成大名鼎鼎的softmax了。逻辑回归和线性回归首先都是广义的线性回归,其次经典线性模型的优化目标函数是最小二乘,而逻辑回归则是似然函数,另外线性回归在整个实数域范围内进行预测,敏感度一致,而分类范围,需要在[0,1]。逻辑回归就是一种减小预测范围,将预测值限定为[0,1]间的一种回归模型,因而对于这类问题来说,逻辑回归的鲁棒性比线性回归的要好。
模型选择
BP backpropagation
用来加速gradient decient, 使用链式法则
其后向传播过程相当于一个逆向网络
验证集作用
交叉验证 拿出validation set
k-fold validition 取 avg
训练技巧
数据预处理方法
- 零均值 X -= np.mean(X,axis = 0)
- 归一化(normalization)
为啥要归一化?
由梯度下降算法决定
- 使得各维度搜索速度大致相同,可以减小搜索难度(更新方向即为切线方向)。不用Adagrad的话没办法各维度学习率不同。
- 防止梯度爆炸。输入过大导致输出过大,梯度过大,学习率过小
- 复用他人的超参数。
梯度消失&梯度爆炸
- 梯度消失:
回传的时候sigmoid函数求导得到的值小于0.4 反向回传越穿越小直至消失 - 梯度爆炸:
初始的权重设得过大,一层一层往前回传的时候导致靠前的网络层梯度过大
解决方式:
权重 ω \omega ω初始化
Xavier初始化和He初始化;
选择合适的激活函数
使用ReLU代替softmax
ReLU的好处是不会稀释正值,而且可以提升训练速度
缺点:在小于0时候,仅仅输出0,是让一些神经元dying
可以使用其变种:RReLU & PReLU & ELU
批量归一化
在2015年的论文中,Sergey loffe和Christian Szegedy提出了一个批量归一化,用他来解决梯度消失和爆炸的问题:
即在每一层激活函数之前在模型中加一个操作:简单零中心化和归一化输入;
之后再通过每层的两个新参数(一个为了缩放,一个为了偏移)
复杂的优化器
Momentum优化
Nesterrov优化
AdaGrad优化
RMSProp优化
Adam优化
如何初始化
初始化一个深层神经网络时,一个比较好的初始化策略是保持每个神经元输入和输出的方差一致。
- Xavier sigmoid 函数
- He ReLU激活函数