白话机器学习

本文最后更新于:2023年2月10日 下午

代价函数(Cost Function)

这里的$e$是均方误差,作为因变量,$w$是原线性神经网络的参数,作为自变量(因为又是用方差作为代价函数的指标,所以又称为方差代价函数)

我们要求的就是$e$最小,也就是误差最小的时候。这个时候的$w$取值,就是拟合程度最好的时候,我们就求出来了$w$最优参数值

因为上面是所有数据的误差,这里还是给出单个数据样本的预测误差计算:

这个时候如果我们想要求最低点,即最优解的时候,可以直接将所有数据一次性带入公式求出

因为代价函数说到底还是一个一元二次函数,所以有:

根据上面的代价公式再次变形可以得到:

这种方式是采用一次性将所有数据带入求解,即普通的正规方程求解

梯度下降(Gradient Descent)

但是在大部分情况下,我们没有这么充裕的计算量来计算上千万的数据量,所以有梯度下降的思路

整体思路就是,我们每次慢慢地调整$w$,直到其达到最优解

方式是:计算出当前$w$取值的斜率$k$,然后让$w=w - \alpha k$

  1. 斜率k可以通过求导得出

  2. $\alpha$用来调整下降过程

  3. 在最优解左边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 协议 ,转载请注明出处!