白话机器学习
本文最后更新于:2023年2月10日 下午
代价函数(Cost Function)
这里的$e$是均方误差,作为因变量,$w$是原线性神经网络的参数,作为自变量(因为又是用方差作为代价函数的指标,所以又称为方差代价函数)
我们要求的就是$e$最小,也就是误差最小的时候。这个时候的$w$取值,就是拟合程度最好的时候,我们就求出来了$w$最优参数值
因为上面是所有数据的误差,这里还是给出单个数据样本的预测误差计算:
这个时候如果我们想要求最低点,即最优解的时候,可以直接将所有数据一次性带入公式求出
因为代价函数说到底还是一个一元二次函数,所以有:
根据上面的代价公式再次变形可以得到:
这种方式是采用一次性将所有数据带入求解,即普通的正规方程求解
梯度下降(Gradient Descent)
但是在大部分情况下,我们没有这么充裕的计算量来计算上千万的数据量,所以有梯度下降的思路
整体思路就是,我们每次慢慢地调整$w$,直到其达到最优解
方式是:计算出当前$w$取值的斜率$k$,然后让$w=w - \alpha k$
斜率k可以通过求导得出
$\alpha$用来调整下降过程
在最优解左边k小于零,在最优解右边k大于零,所以可以逐渐逼近最优解
这里给出线性神经网络函数的斜率公式,加深理解:
批量梯度下降
将所有的数据拟合成一个函数求斜率$k$,然后逐渐误差下降求得最优解
在计算量上,没有比正规方程一次性求解降低多少,所以一般不考虑而采用下面这一种
随机梯度下降
每次根据一个数据来求出一个斜率,然后逐渐下降得到最优解
震荡实在太大,最后还不知道离全局最优解有多远
迷你批量梯度下降
结合结合以上两种梯度下降方式,每次取一批(上百个)数据来求出一个斜率,慢慢下降得到最优解
较为折中的方式,中和了两种的优点
激活函数
比较符合我们常识的是在脑中声建立一种思维,用来判断一个东西是否属于一个类别,而不是通过数学建模的方式在脑中得到一个函数。于是我们有了激活函数来进行分类
Sigmoid函数
我们所说的sigmoid函数是一类可以将数据样本分成0和1两类的函数,而我们比较常说的sigmoid函数如果不加说明,就是标准logistic函数:
这个时候我们拟合的就是一个复合函数,而图像就是一个logistic函数的图像,我们还是可以通过分别求出w和b的偏导得到梯度下降的向量来进行梯度下降
神经网络
在这之前,我们都是用一个神经元,也就是一个函数来完成预测。如果一个需要拟合的函数不再单调,这时候就需要引入更多的神经元,也就是形成了神经网络。
隐藏层
那些新添加的神经元节点就是隐藏层,每一个隐藏层不只有一个神经元,而通常是多个。这些隐藏层多个叠加到一起形成深度神经网络
用线性函数组合,用激活函数输出,用代价函数评估,用梯度下降优化
输入和输出通道
在图像的卷积操作上,基本上数据都是三维的($x_1x_23$),比如rgb图片,所以我们就有了输入和输出通道
首先需要理解的一点是:卷积核也可以是多维度的
比如一个$663$的输入数据矩阵,我们就需要一个3维的卷积核,比方说取一个$333$的卷积核,卷完之后会得到一个$661$的矩阵(每次卷的时候会将三层上的所有数据相加)
那么如果想要保持3维数据的特征,就必须要再加上2个卷积核进行卷积
这样想下来,input_channel就是输入数据的通道数(第三维的数值),而output_channel则是当前
pytorch使用要点
卷积需要记住的公式
首先是卷积模型必备函数
nn.Conv2d(input_channel, ouput_channel, kernel_size, stride, padding),
# 通常之后会加上一个激活函数ReLU
nn.ReLU()
以下都是以stride为1作为默认(默认每次移动一格)
input_size - kernel_size + 1 + 2*padding = ouput_size
如果有输入大小和输出大小相等的情况:
padding = (kernel_size - 1) / 2
这部分解释了为什么卷积核需要用3,5这样的奇数
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!