从线性模型到神经网络

线性模型

普通线性模型

  • 线性模型表示方法

img

损失函数

  • 衡量一个模型的好坏。
  • Loss Function

img

  • 最小化损失

    img

梯度下降

  • 通过梯度下降更新参数,求优解。

    img

    img

  • 简而言之,就是求解

    img

  • 当然,梯度下降也存在一些问题,比如局部最小,local minima问题,还有saddle point 也就是说微分是0但是不是极值点的时候。值得一提的是,如果我们是对线性损失函数进行梯度下降的话,不用太担心这个问题,因为它是一个bowl的形状,之后会说更多关于简单梯度下降的不足之处。

  • img

什么样的线性模型才会取得比较好的效果?

  • 高次拟合?
  • 添加更多特征项?

高次拟合

  • 它仍然是一个线性的MODEL,所谓线性,这里是看模型参数对output是线性的。

img

  • PS. 泰勒展开告诉我们,高次拟合很容易带来过拟合的问题,使模型失去逻辑意义,因为任何解析的函数都可以用高次多项式去逼近。
  • 复杂的模型一定会在训练集上取得好的效果,但是测试集上可不一定,这就是过拟合带来的影响。

img

更复杂一些

  • 加入了一个新的影响因素,作为一个指示函数,这仍然是一个线性模型。
  • (李宏毅)这里使用神奇宝贝的例子。

img

  • 那么我们的新模型就变成了下图,同样如果添加太多,过拟合现象比较严重:

img

正则化

  • 为了减少过拟合情况发生,平滑拟合曲线,我们添加正则化项。

  • 使用regular正则方法,选择更加平滑的参数。

  • “没有对错,只是好坏。”

  • 之所以只添加w的正则化项,而非没有带上b,是因为b代表水平变化,对平滑程度没有影响。

    而我们的假设是,平滑的function是好的function。

    img

梯度下降的一些小问题

  • 学习率设定不当会存在一些问题

img

  • 很依赖经验。
  • 当然也可以使用一些自动变换学习率的方法,防止出现学习率太高震荡太低无法达到较优解的情况所以使用了个性定制化的学习率,让W和B的学习率会动态变化。也就是我们常用的adapt方法。

img

img

img

img

img

  • 代码实现就比较简单了:

img

  • 这时候我们会发现一个问题,那就是,原本梯度越大,更新的步伐就越大,但是现在梯度越大,分母就越大,分母越大,步伐就越小,是不是说明adapt-gradient不符合常理呢?
    • 其实不是的,有些论文内说,这是为了凸显一种反差的效果,所以会把之前的信息(梯度)也都带上,一起来判断现在出现的梯度是不是有反差的。

img

  • 从这儿来看出什么时候步伐是比较合适的,就是在这个步伐正比于我们的梯度的时候,但这个是在只考虑一个参数的时候才能成立的。

img

  • 在多个参数,比如这里两个参数的时候,有些东西就不成立了。比如在只有一个参数W1的时候,a是比b微分大,距离远的,但是在两个维度的时候,c微分值大于a但是距离谷底却小于a。所以在这里我们要引入一个新的东西来描述我的们更好的梯度步长(学习率)。

img

  • 一个方法就是把我们的二次微分也考虑进来,当然,考虑到计算量的优化,adapt-gradient把二阶微分用一个平方和来近似,这样综合考虑一个最合适的步长:

img

  • Stochastic 梯度下降,居然是只取一个进行损失,而且最好是随机取。特别是在深度学习中,随机取是更有帮助的。

img

  • 效果一览,已经进行了20次参数更新了,速度更快:

img

  • 还有一个操作(Tip)是做scaling。

img

  • 不做scaling可能会造成不好的影响,梯度下降方向直接快速,看红色箭头:

img

标准化的方法

img

快速找到梯度下降的方法(梯度下降的来源)

  • 如何快速找到某个区域内梯度下降的方向,这一部分展示的是泰勒展开,泰勒级数,当x接近x0的时候,后面的项可以消除。

img

  • 如果是多个参数的情况下的话,如这里是二元泰勒:

img

  • 因此我们有:

img

  • 那么左下角的式子就是右图圈圈中的LOSS表示,接下来我们来寻找loss最小情况:

img

img

  • 这样就得到了我们所说的梯度下降,前提是learning rate必须够小,因为learning rate 和红色圈圈的半径成正比 。

img

梯度下降三大尴尬瞬间

  • 高原、平原、local minima(局部最小)

img

Bias与Variance

  • 如何识别我们拟合效果不佳,是源自Bias还是Variance?

img

Variance

  • 样本的均值m≠μ,但期望是μ。
  • N越大 m会越接近μ variance会越小。

img

Bias

  • 算真实的方差 和 样本估算方差之间的差异

img

有效性与无偏性

  • 其实是一个有效性 和 无偏性的问题,举例子是说,没瞄准和瞄准了发生偏差之间的关系。

img

  • 简单model有比较小的variance,复杂model有比较大的variance。

img

  • 复杂model有小的bias,简单model有比较大的bias。

img

  • 这张图很好的反应了复杂与简单的模型之间的关系,简单模型bias大,variance小,所以可能没有包含我们的target。复杂模型bias小,但是variance大,虽然包含了我们的target但是范围很大。

img

  • 红色是bias,绿色是variance,综合考虑两者,就是蓝色的线,也就是我们之前所拟合时候给出的。最左边叫欠拟合,最优区域叫过拟合。也就是说,在训练集上效果不好,欠拟合。在测试集上效果不好,过拟合或者欠拟合。这张图也可以看出来,我们的模型到底是因为bias产生错误,还是variance产生错误。过拟合是variance,欠拟合是bias。

img

如何处理variance不好的情况?

  • 更多数据。
  • 正则化项。

img

模型选择

  • 只有训练集和测试集其实很多时候是不够的,因为即使是测试集也并不一定很好的反应了真实数据的分布,这时候我们可以引入交叉验证。

img

交叉验证

  • 交叉验证,可以不考虑测试集的bias情况。我们加入验证集,这时候在验证集上面的效果可以说是比较真实反映了模型的效果。
  • 如果怕自己分的验证集也不靠谱,可以进行多折交叉验证。

img

分类问题

  • 在处理分类问题的时候,可以把分类问题视为线性回归来解决,比如将A类视为1,B类视为-1,最后看结果距离1和-1哪一个比较近。
  • 但是使用简单的线性回归会出现这样的问题。由于线性回归的特性,紫色线条会视为比绿色线条更好的拟合线,但是明显对于分类问题而言,绿色的线条才是最好的。
  • 也就是说。简单线性回归容易受到噪声或者极值的影响。

img

  • 另一方面,类别1、2、3之间不应该存在距离差异,在线性回归看来1、2、3是有关系的,比如1和3距离比较远,但是在分类问题看来不应该存在这种关系。

    img

Generative model

  • 通过train data,可以计算出能够进行生成某一item概率的模型。
  • 简单全概率思想。

img

  • 高斯概率密度分布,输入一个向量,返回这个向量表示对象的概率密度,勉强可以算是一个概率表示。μ和Σ(协方差矩阵)分别表示了不同的中心点和分布形式。

img

  • 插一个协方差矩阵小贴士:

    img

  • 如果能够通过数据,把一个高斯分布的μ和Σ都求出来,这样我们就可以估计一个新的点在这个分布中出现的概率情况了。

img

  • 极大似然,简单地估一下在哪个μ和Σ下得到这个分布表示的概率比较高。

img

img

  • 做微分求极值,或者套上面👆的公式。

  • 这样我们解决了一个小问题,一个在训练集里面不存在的点,如何估算这个点属于某个类的概率。

    这个方法使用得较少,效果也很一般,这个宝可梦的任务里,7维才54%。

img

  • 这个方法中,μ、Σ可以共享一套,做法:

img

  • 这样得到的模型,我们同样可以视为一个线性模型,因为他们两个boundary共用一套μ、Σ,分界线也是一条直线。
  • 最后得到的准确度有73%。

img

简单小结一下

img

如何选择模型?

  • 如何选择模型,其实是看人啦……

img

数学化简为WX+B的形式,顺带搞出sigmoid

img

img

img

img

img

img

  • 推完收工,但是太麻烦了,为什么我们不直接来找w和b,还要先求μ和Σ呢,引出logistic regression。

Logistic Regression

回忆一下,首先我们为了得到全概率公式情况下某个向量属于某个类的情况,然后使用高斯去拟合某个类中某个值的概率,最后进行了一个取对数再取对指数,变成了sigmoid,最后化简操作变成了wx+b,那么这里我们把所有的w和b集合在一起,变成了一个Fw,b(x)。

img

  • 其实通过上面的一系列操作,我们就得到了logistic回归了。

img

  • 在已有训练集的情况下,我们要找到能够最大化我们loss function的一组参数。

img

  • 变形一下:

img

  • 其实这个就是一个交叉熵(两个分布有多接近,其实也就是说,真实的target P 和我们训练得到的distribution Q 多接近了)损失了

img

  • 做一下梯度下降的求导。

img

img

img

  • 其实最后得到的结果还是很好理解的,前一项表示的是差距有多大。
  • 值得一提的是,这和我们之前线性回归得到的梯度更新方法其实是一模一样的。这张图PO了一下两者之间的差异,还挺清晰的。

img

  • 不过这张图的Step2里面有个问题,为什么我们不能再logistic regression里面也用和线性回归一样的square error,而是用交叉熵呢?

img

  • 解了一下会发现,不论我们距离target是远还是近,我们都会发现他的gradient是0,这明显是不科学的。参数update会很慢,learning rate大小不知道怎么样合适。因为梯度算出来很小,可能是距离最优解很近,也可能是很远。

img

生成和判别两个模型,其实是相似的,但是得到的结果其实是不一样的!

img

因为我们在logistic里面没有假设,但是在生成里面我们是做了假设的,比如高斯、伯努利等等不同分布。

img

  • 我们做一个小例子,来比较生成模型和判别模型之间的小差异。

img

  • 把概率都写出来:

img

  • 来了一个新的sample

img

  • 反而认为这个样本是class2了,怎么会发生这种奇怪的事情呢
  • 一是因为样本量不均衡
  • 二是概率模型并不认为没有出现就是不存在。
  • 这也说明了其实样本量不多、或者有噪声的情况下,生成性模型是更好的。但是我们使用判别性模型还是比较多的,因为在大规模数据库中比较好计算,而且比较准确。

多分类

多分类当然要请出我们的softmax啦,其实softmax如果只有两个item的话,就和logistic regression一样的!

img

img

局限性:异或问题

  • 异或问题,单层感知机是无法解决的,也就是logistic regression是无法解决的。

img

  • 如果一定要解决的话,可以做特征变换:

img

  • 但是这件事是不容易的,不如看成是多个logistic regression的结合!

img

img

img

  • 我们成功分开了他们,这也是NN的雏形,那么学习的时候也是靠反向传播BP算法。