笔记是在语雀上面做的,粘贴在CSND上可能存在格式错误
机器学习的本质就是借助机器寻找一个转换函数
根据函数的输出类型,可以将机器学习进行分类
- regression 回归任务:函数输出时一个数值
- classification 分类任务:人类设定好选项/类别,函数的输出时选项/类别中的一个
- structured learning : 机器创造一些有结构的信息,比如文本、图
过拟合Overfitting
:在训练资料上变好,在没有训练的资料上效果边差
问题1:机器怎么寻找一个转换函数
案例:Youtube频道订阅人数的预测
步骤1:写出一个带有未知参数的函数
猜测其转换函数应该长什么样,这个函数的猜测过程就需要用到领域知识。
猜测:未来点阅次数的函式F,是前一天的点阅次数,乘上w 再加上b
- y y y 是我们要预测的人数
- x 1 x_1 x1是这个频道前一天总共观看的人数
名词定义
Feature: Function裡面我们已知的信息 x 1 x_1 x1
Weight: 未知参数
Bias: 未知参数,偏差值
步骤2:从训练数据里定义Loss损失函数L(b,w)
函数的输入是b和w,函数的输出是输入某个特定的b和w,模型结果是是好还是不好
L越大说明模型不好,L越小说明模型好
假设有一个损失函数L(0.5k,1) ,模型为y=b+wx1 => y=0.5k+1x1(k是千人的意思)
训练数据(本案例过去的订阅次数)输入到模型(函数)中,比如x输入1月1日订阅人数4.8k,计算得到模型预测的y(1月2日订阅人数)为5.3k,但实际只有4.9k
计算方法: 求取估测的值跟实际的值(Label) 之间的差距
本案例中e取绝对值的方法称为mean absolute error(MAE)平均绝对误差
e=(y-y预测)2称为mean square error(MSE)均方误差
如果y与y预测都是概率分布,可能选择的e为coss-entropy交叉熵
步骤3:optimization
优化 让Loss值最小
优化式:w*,b* = arg m i n w , b \underset {w,b}{min} w,bminL,寻找参数w和b让L最小,将其称为w和b。
本课程用到的Gradient Descent
梯度下降方法
-
随机选取初始值:假设只有一个参数w,随机选择一个初始点w0
-
计算 ∂ L ∂ W ∣ w = w 0 {\frac{\partial L}{ \partial W}}|_{w=w^0} ∂W∂L∣w=w0
-
根据微分(梯度)的方向,改变参数的值,优化的目标是降低损失值。
-
根据微分(梯度)的方向,改变参数的值–应该降低w还是提升w取值?
①如果计算出来斜率为负,说明该点w0 处损失值L呈下降趋势,因此增加w就可以获取到更低的L值
②同理如果计算出来斜率为正,说明损失值L呈上升趋势,因此降低w值可以获取到更低的L值
w改变的跨度取决于斜率的大小与学习率的大小,移动跨度公式: η ∂ L ∂ W ∣ w = w 0 \eta{\frac{\partial L}{ \partial W}}|_{w=w^0} η∂W∂L∣w=w0
①斜率大说梯度大损失值改变大可以大幅度降低w。
② η \eta η表示学习速率 ,该值自己设置,在机器学习中,自己设置的固定值称为hyperparameters超参数
-
-
新的w1 = w0- η ∂ L ∂ W ∣ w = w 0 \eta{\frac{\partial L}{ \partial W}}|_{w=w^0} η∂W∂L∣w=w0 ,重复操作2和操作3不断更新w的取值
-
什么时候停下来
- 自己设置上限,这个上限也是一个超参数。比如设置更新w 1000次。
- 理想情况:微分值为0(极小值点),不会再更新
梯度下降存在问题:有可能陷入局部最小值,不能找到全局最小值 (事实上,局部最小值不算梯度下降真正的痛点)
问题:为什么损失值可以取负数?
估测的值y跟实际的值(Label) 之间的差距在本案例中是取绝对值,不可能有负数。这里图是随便画的和本案例无关
推广到多个参数 => 类似一个参数的做法
不断更新参数,直到找到一个 w 和 b
模型的修改
利用模型预测未知日期新的观看量,发现每个7天一个循环(周一到周四观看量高,周五到周六观看量低,周末观看量增加)
原来的模型只能依据前一天的值预测当天值(随便猜测y=b+wx1),根据上图我们发现其实观看人数呈周期变化,这里猜测采用上周值预测本周值可以得到更精准的模型(对问题有了更深的理解)。
修改新模型为 y = b + ∑ j = 1 7 w j x j y=b+{\sum_{j=1}^7}{w_j}{x_j} y=b+∑j=17wjxj,下标j表示根据前7天的观看人次,预测当天的观看人次=> 也可以考虑更多天的观看人次
相当于将一个特征值x1 (w同)增加到了7个特征值x 1~7
神经网络
线性模型
linear models =Feature*Weight + bias
=> 不是要一模一样,在模型修改中的
y
=
b
+
∑
j
=
1
7
w
j
x
j
y=b+{\sum_{j=1}^7}{w_j}{x_j}
y=b+∑j=17wjxj也是线性模型
线性模型存在严重限制Model Bias
(跟前面说的变量b bias意思不同):y只会随x1线性变化 ⇒ 解决方法:需要一个更复杂的、有未知参数的function
Sigmoid Function改写步骤1:写出一个带有未知参数的函数
所有Piecewise Linear Curves
分段线性曲线( 定义:由多段锯齿状的线段所组成的线 )= 常数 + 一大堆蓝色function(每一段的蓝色function可能不一样,下述案例只是举例)
=> 可以用Piecewise Linear Curves
逼近任何连续曲线
在案例Youtube频道订阅人数的预测
中,即使x和y的关系很复杂,但我们感觉应该还是一条连续曲线,所以只要想办法写一个带有未知数的function(常数+一堆蓝色function )
并不知道如何写出这个function,使用Sigmid Function Curves
来逼近这个function
Sigmoid Function
(S形函数):
y
=
c
1
1
+
e
−
(
b
+
w
x
1
)
y = c\frac{1}{{1+e^{-(b+wx_1)}}}
y=c1+e−(b+wx1)1
调整 w , b , c w,b,c w,b,c,可以得到各种不同的sigmiod来逼近”蓝色function“,通过求和,最终近似各种不同的连续Function
总结
- 用
Piecewise Linear Curves
逼近任何连续曲线,Piecewise Linear Curves
= 常数 + 一大堆蓝色function,所以需要表示蓝色function(但是并不清楚怎么表示)。 - 使用
Sigmid Function Curves
(可以表示任何连续曲线)通过调整来$ w,b,c $逼近这个蓝色function。
案例理解
套入这个本课程的案例,模型可以表示为$ y=b+\sum_isigmoid(b_i+w_ix_1) $(当天的观看人数和前一天的有关)
调整 b 、 w 、 c b、w、c b、w、c可以制造不同的蓝色function,不同的蓝色function叠加起来就可以制造出不同的Piecewise Linear Curves ,不同的Piecewise Linear Curves可以去逼近不同的连续函数
前面我们优化过,其实当天的观看人数可以和前几天的有关,模型可以表示为 y = b + ∑ i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j) y=b+∑isigmoid(bi+∑jwijxj)i是不同的function函数数量,j表示当前日期的前j天, w i j w_{ij} wij第i个sigmoid给第j个特征的权重
下面将i和j带入实际例子理解一下,假设这个模型由三个不同的sigmoid function
叠加生成(sigmoid的数量是自己决定的超参数),当天的预测人数与前三天的观看人数有关,也就是j和i分别取1、2、3
转化为线性代数的形式
- 将 b i + ∑ j w i j x j b_i+\sum_jw_{ij}x_j bi+∑jwijxj等价成 r = b ⃗ + 矩阵 W ∗ x r = \vec{b} + 矩阵W*x r=b+矩阵W∗x形式
- a = s i g m o i d ( r ) = 1 1 + e − r = σ ( r ) a = sigmoid(r)=\frac1{1+e^{-r}}=\sigma(r) a=sigmoid(r)=1+e−r1=σ(r),将a的表示简写为 σ ( r ) \sigma(r) σ(r)
- 模型线性代数的表达为 y = 常数 b + c T a = 常数 b + c T σ ( r ) = 常数 b + c T σ ( b ⃗ + 矩阵 W ∗ x ⃗ ) y=常数b+c^Ta=常数b+c^T\sigma(r)=常数b+c^T\sigma(\vec{b}+矩阵W*\vec{x}) y=常数b+cTa=常数b+cTσ(r)=常数b+cTσ(b+矩阵W∗x)
公式中x为feature 未知参数为矩阵W、常数b、 b ⃗ \vec{b} b 、 c T c^T cT,一般将矩阵W每一行/列抽出来与其他向量拼在一起,将所有的参数统称为 θ \theta θ.(包含 W, b ⃗ \vec{b} b ,b…)
第二步:定义Loss损失函数L( θ \theta θ)
因为所有的参数统称为 θ \theta θ,所以Loss表示为 L ( θ ) L(\theta) L(θ)。
输入x求计算出来的 y = b + c T σ ( b ⃗ + 矩阵 W ∗ x ⃗ ) y=b+c^T\sigma(\vec{b}+矩阵W*\vec{x}) y=b+cTσ(b+矩阵W∗x),还是利用平均绝对误差法计算与真实label y ^ \hat{y} y^的误差绝对值 e = ∣ y − y ^ ∣ e=|y-\hat{y}| e=∣y−y^∣,损失函数 L = 1 N ∑ n e n L=\frac{1}{N}\sum_n{e_n} L=N1∑nen
第三步:optimization优化 找到参数使L最小
- 选定初始参数值(向量) θ 0 \theta_0 θ0
- 对每个参数求偏导/微分,每个参数求偏导组成的矩阵叫做
gradient
梯度有些时候简写为` ∇ \nabla ∇, ∇ L ( θ 0 ) \nabla{L}(\theta^0) ∇L(θ0) - 更新参数,直至设定的次数
批训练Batch training
实际上, 不会一次性将全部数据用于训练一个L,而是将全部资料分成n个batch(这里的n也是一个超参数)去训练n个L。
定义
- 1 epoch 时期= 使用所有batch的L更新一次 θ \theta θ
- 1 update/iteration = 每更新一次参数 θ \theta θ
比如有资料N=10000,每个batch划分的资料是100,那么一共有100个batch,一次epoch里会更新100次 θ \theta θ
问题:为什么要将全部资料分成一个一个batch
todo
模型的其他变形
使用Rectified Linear Unit线性整流单元
在上述案例中,我们是将蓝色function(hard sigmoid)近似为<font style="color:#DF2A3F;">(soft)sigmoid function</font>
,其实这里还有其他的做法。
比如:每一个hard sigmoid
可以使用两个线性整流单元Rectified Linear Unit
(ReLU)叠加
图形上的表示为一个折线(两个水平线有一个转折点),公式表示为 c max ( 0 , b + w x 1 ) c\max(0,b+wx_1) cmax(0,b+wx1),上述的模型 y = b + ∑ i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum_isigmoid(b_i+\sum_jw_{ij}x_j) y=b+∑isigmoid(bi+∑jwijxj)可表示为 y = b + ∑ 2 i m a x ( 0 , b i + ∑ j w i j x j ) y=b+\sum_{2i}max(0,b_i+\sum_jw_{ij}x_j) y=b+∑2imax(0,bi+∑jwijxj),其中i表示函数的条数,1个hard sigmoid需要用2个relu函数叠加而成
:::tips
这里的sigmoid和Relu在机器学习中被称为Activation funtion激活函数
:::
问题:哪一个激活函数效果更好
todo
增加嵌套层数
生成a后,可以嵌套生成a’,这里的嵌套次数是一个超参数
问题:为什么可以这样做,这样做的原因是什么
这里感觉没讲明白
我的理解:从图像来讲a表示的是一个s型曲线(c只影响高度),将一个hard sigmoid逼近为一个sigmoid。那再做一次表示再逼近一次?
Deep Learning
以前的叫法:这些sigmoid或者Relu被叫做一个neuron
神经元,很多neurl被叫做Neural Network
神经网络
现在的叫法:每一排Neural
叫做一个hidden layer
,很多hidden layer
被叫做Deep
,这一套技术被叫做Deep Learning
深度学习