函数
前言
这个世界上所有的逻辑和知识都可以用一个函数来表示,我们只需要将现实世界抽象为符号再设置好一些运算规则(函数)最后算出结果反过来再解释现实世界就可以了。

**注意:**现实中的很多问题人类实在想不出来一个明确的函数,因此为了找到这样的函数就采取人类有史以来最具智慧的办法------猜。这样猜到的函数很难完全吻合现实,但是为了简化问题,猜的大差不差就行,不要要求这么多。
分类
- **线性函数:**类似于f(x)=wx+b的函数,其是一条直线。
- **非线性函数:**f(x)=(wx+b)²/f(x)=sin(wx+b)这样不是一条直线的函数(在线性函数的外层再套一层非线性运算就可以)
- **激活函数:**f(x)=g(wx+b),其中g()就是外层的非线性运算,它的目的就是把原本死气沉沉的线性关系盘活,进而变成变化能力更强的非线性关系(常用的激活函数都简单到爆炸)
- **多输入函数:**f(x1,x2)=g(w1x1+w2x2+b),这是现实中常出现的多输入的函数。
- **拟合函数:**f(x1,x2)=g(w4g(w3g(w1x1+w2x2+b1)+b2)+b3),类似这样的拟合函数输入数量不定,外层的非线性关系不定。通过这种方式(外层不断的套线性变换再套激活函数)理论上可以拟合现实中的任意函数。
神经网络
神经元

**含义:**f(x)对应输入层只有一个输入x,g(wx+b)对应输出层只有一个输出y,我们把这里面的每一个小圆圈叫做一个神经元。
神经网络

输入层可能有多个,同时也可以不断地在外层套线性变换再套激活函数。那么每套一层就相当于神经元向水平方向扩展了一个。当然扩展之后中间这一层就不再是最终的输出了,而是包裹在一个很复杂的函数变换之中看不到,我们把它叫做隐藏层。而整个输入层、隐藏层、输出层的神经元相互连接所组成的网络结构就叫做神经网络。
前向传播

首先有2个输入变量量x1和x2,他们构成了输入层。然后对x1和x2进行了一次线性变换再进行一次激活函数就得到了隐藏层a(a就对应w1x1+w2x2+b)我们把a当作一个整体继续进行线性变换和一次激活函数就计算出了最终的输出层y。从神经网络的图来看似乎就像一个信号从左到右传播了过去。这一整个过程就叫做神经网络的前向传播。
**注意:**神经网络的每一层神经元都可以无限的增加,同时隐藏层的层数也可以无限的增加,进而可以构成了一个非常非常复杂的非线性函数了。虽然这个函数可能非常的复杂,但是我们的目标却非常的简单和明确:就是根据一组x和y的值来猜出这里面的w和b各是多少进而使这个函数可以很好的拟合真实数据。
计算w和b
**前言:**我们的目标是计算出好的w和b从而得到函数进而使输出结果尽可能拟合真实数据,因此好的w和b就是使得函数的输出尽可能拟合真实数据的那组参数。
损失函数

我们为了找到拟合真实数据好的函数我们可以在每个数据点上画一条竖直的直线使其与拟合函数相交。这里面每个点的纵坐标表示的是真实数据y,而落在直线上的点表示预测数据Y。那么这两点间的距离就是真实值与预测值的误差|y-Y|。为了评估整体的拟合效果我们可以将所有的这些线段的长度加起来NΣi=1 |yi-Yi|。这样就得到了预测数据与真实数据之间的总差异,也就可以反映当前这个函数与真实数据的拟合度了。而这个表示预测数据与真实数据误差的函数我们叫他损失函数。
均方误差
NΣi=1 |yi-Yi|这个绝对值数学优化时很不方便,因此我们用平方代替进而式子变为NΣi=1 (yi-Yi)²。这样一来一方面可以解决绝对值不平滑的问题,二来可以放大误差较大值的影响。然后我们再根据样本数量平均一下消除样本数量大小的影响最终得到均方误差------1/N NΣi=1 (yi-Yi)²
**注意:**均方误差就是损失函数的一种,我们把损失函数记为L。从参数的视角来看他就是一个关于w和b的一个函数(x都有,y就是x与w和b不确定的一个函数)
误差最小

**注意:**损失函数表示的是真实值与预测值之间的误差,而我们的目的是让这个误差最小,也就是找到可以让损失函数最小化的那个w和b。如此对于该损失函数来说就相当于让其导数为0进而求极值点(多元函数求极小值的问题是求偏导数为0)
W和B的偏导数分别为:

**注意:**通过寻找一个线性函数来拟合x与y之间的关系就是机器学习中最基本的一个分析方法------线性回归。
梯度下降
尝试法
神经网络是一个通过线性函数和非线性激活函数不断组合进而形成的一个非常复杂的非线性函数,那么它对应的损失函数则是更复杂的非线性函数。其往往不能通过让导数=0直接求出最小值,那么人们只能一点点的试进而试出最小值。

**试的方法:**在损失函数中尝试把w增加一个单位发现损失函数减小了,这说明w的此次调整是对的。尝试把b增加一个单位发现损失函数增加了,则说明b的此次调整是错的。那我们就反过来把b往小了调进而让损函数继续变小。如此循环往复,求出最小值(我们每次都看一下当前状况调整w或b对损失函数的影响,然后每次把参数向着让损失函数变小的那个方向调整一点点,直到让损失函数足够小)
实现方式
**前言:**W变化一点点使得损失函数会变化多少这其实就是损失函数对w的偏导数,对b来说同样也是如此。而我们要做的就是让w和b不断往偏导数的反方向去变化,而具体变化的快慢再增加一个系数η来控制我们叫他学习率。

**注意:**这些偏导数所构成的向量就叫做梯度,而不断变化w和b让损失函数逐渐减小的一个过程进而求出最终的w和b这整个过程就叫做梯度下降。
求偏导
前言: 虽然神经网络整体所代表的函数很复杂,但是层与层之间的关系确是非常简单的我们以f(x)=w2g(w1x+b1)+b2为例求偏导。

反向传播

**注意:**这个神经网络有四个参数要通过梯度下降的方式逐步求解:w1,b1,w2,b2。关键是求出它们的偏导数。这里以最难的w1为例。

**反向传播:**由于我们可以从右向左依次求导然后逐步更新每一层的参数,直到把所有的神经网络参数都更新一遍。在计算前一层时用到的一些偏导数的值后面也会用到所以说不用计算这么多,而让这些值从右向左一点点传播过来就好了,我们把这一过程叫做反向传播。
训练
**前言:**我们通过前向传播根据输入x计算输出y,然后再通过反向传播计算出损失函数关于每个参数的梯度,然后每个参数都向着梯度的反方向变化一点点,这就构成了神经网络的一次训练。

**注意:**神经网络经过多轮这样的训练,里面的参数都一点点的变化,直到让损失函数足够小,也就是找到了我们想要的那个函数。
过拟合
含义

**含义:**我们的目标是让数据尽可能拟合的好,从预测值与真实值误差来看也就是损失值最小化这个目标来看的话,显然右边的这个函数拟合的更好。但直觉似乎告诉我们右边这个好像有点儿好的太过了,结果可能是只适合训练数据而对新数据的预测反而不如左边的准。这种在训练数据上表现的很完美但在没见过的数据上表现的很糟糕的现象叫做过拟合。而在没见过数据上的表现能力我们叫他泛化能力。
**注意:**过拟合告诉我们神经网络不是越大越好。
原因
**过拟合原因:**虽然数据本身是个很简单的规律,但模型太复杂了把那些噪声和随机波动也给学会了。
解决方法
- 简化模型复杂度
- 增加训练数据的量(数据量足够充足,那么原本复杂的模型也就相对变得简单了)
措施
数据增强
**数据增强:**有的时候我们确实无法收集或者懒得收集更多的数据,那么我们可以在原有的数据中创造更多的数据。比如在图像处理中我们可以对图像进行旋转、翻转、裁剪、加噪声等操作进而创造出更多新的训练样本,这就叫做数据增强。

**鲁棒性:**数据增强不仅仅能够产生更多的数据,还刚好训练了一个让模型不禁输入的一点点小的变化而对结果产生很大的波动,这就是增强了模型的鲁棒性。
提前终止训练
前面是从数据和模型本身入手来防止过拟合的发生,但是也可以从训练过程入手来阻止过拟合。训练过程就是不断调整参数的过程,因此只要不让参数继续过分的向着过拟合的方向发展就可以了。因此,我们可以提前终止训练过程(差不多就行了)
设置惩罚项
**前言:**由于参数是让损失函数变小的方向发展而训练出来的,那么我们可以在损失函数中把参数本身的值加上去。这样在参数往大的调整时,如果让损失函数减小的没那么多进而导致新的损失函数值反而是变大的,那么此时调整就是不合适的。因此一定程度上就抑制了参数的野蛮增长。

**注意:**除了可以用参数的绝对值之和之外,我们还可以用参数的平方和。这样参数大的时候抑制的效果就更强了。我们把这一项叫做惩罚项,把通过这种向损失函数中添加权重惩罚项目抑制其野蛮增长的行为叫做正则化。我们也可以增加参数来控制惩罚项的力度,我们称之为正则化系数。
Dropout
**案例:**假如神经网络中的参数是一支军队里面有好多普通士兵,但是其中混入了一支战斗力极强的长官。然后你研究各种战术让士兵和别人打仗。如果每次训练都由长官主导战局,那么你会误认为整体的战斗力很强。一旦遇到特殊情况就会败北,这就是过度依赖少量参数的典型表现。

**理解:**我们的目的是为了防止让模型过于依赖某几个参数,因此我们可以在训练过程中每次都随机丢弃一部分的参数。让长官偶尔缺席,这样模型就必须学会依赖更多普通的士兵从而避免了在某些关键参数上过度依赖的风险。这种方法叫做丢弃。