1. 机器学习基本概念
机器学习就是找一个函数
1.1分类
- 输出连续为回归regression
- 输出离散为分类classification
1.1.1 regression常见应用
1.1.2 classification常见应用
1.2 方法
1.2.1 监督学习(Supervised Learning)
过程:
- 数据库中拿到特征数据
- 人工标记
- 给模型训练
特点:
- 收集标记过的数据的人工成本大
- 每个任务都需要标记过的数据
1.2.2 自监督学习(Self-supervised Learning)
过程:
- 预训练(学基本功)
- 微调
- 完成下游任务(其他类似任务)
1.2.3 GAN(Generative Adversarial Network)
过程:
- 收集到大量的x和大量的y
- 机器会自动的把x与y的函数关系找出来
1.2.3 半监督学习
定义:训练集同时包有标记样本数据(有目标值)和未标记样本数据(无目标值)。
- 数据库中拿到大量特征数据
- 从中取出少量特征数据
- 专家标记出少量目标数据
- 然后用少量标记过的以及大量的未标记的数据训练
1.2.4 强化学习(Reinforcement Learning - RL)
定义:自动进行决策,并且可以做连续决策。
解决:有些任务人工也标记不了,但是能定义什么的成功(例如:围棋最优解)
主要包含五个元素:
- Agent:智能体,指的就是你写的算法,在游戏中就是玩家。
- Action:行为,智能体通过一套策略输出一个行为作用到环境。
- Reward:奖励值,环境反馈给智能体的奖励值。
- Environment:外部环境,在游戏中就是游戏的环境。
- Observation:状态值,环境反馈给智能体的状态值。
目标:获取最多的累计奖励
1.3 小案例
1.3.1 任务描述
需要根据以前的数据预测明天的点赞量
1.3.2 步骤一:随便猜测一个Model
名词解释:
Model:模型,一个带有未知参数的函数
feature:特征,已知的数据
w(weight):权重,相乘的未知的参数
b(bias):偏置,相加的未知的参数
1.3.3 步骤二:定义Loss函数
Loss是一个函数,参数是b和w,即L(b,w),输出为Model的预测值和目标值的差距。
求取各种w和b的组合,画出Loss函数的等高线图(Error Surface)
1.3.4 步骤三:最佳化
找一个w*和b*,使得Loss函数最小
下面以一个参数w举例介绍梯度下降
采用梯度下降(Gradient Descent)方法:
-
随机选一个初始参数
-
求偏导
- 若偏导小于零即左高右低,向右走加变量
- 若偏导大于零即左低右高,向左走减变量
-
更新参数
- 走的距离与斜率以及η有关,其中η为学习率(自己设定)
-
截至条件
- 根据一个最大更新次数的hyperparameter
- 算出偏导为零的极小值点
梯度下降有局部最优而非全局最优的问题
名词解释:
- hyperparameters:超参数,自己设定的已知参数
实操多元时优化过程如下
1.3.5 步骤四:测试
数据集分为训练数据和测试数据,其中
- 训练时Loss为0.48k
- 测试时Loss为0.58k
1.3.6 步骤五:增加特征数据
打算用前七天的数据而非前一天作为参数,也可以考虑更多天(例如一两个月左右,28天以及56天)
发现56天与28天误差的变化并不大,特征数据的影响越来越小了
1.3.7 更flexible的模型
1.3.7.1 线性模型的缺陷
名词解释:
- Model bias(模型偏差):由于模型过于简单或假设不当,无法充分捕捉数据中的复杂关系,导致预测性能受限的现象
1.3.7.2 复杂函数构成
任何一个复杂的函数都可以看作一系列蓝色函数与常数的组合(只要蓝色函数足够多)
同理,曲线也可以
其中上述蓝色函数也就是激活函数
1.3.7.3 激活函数(Activation function)
1.3.7.3.1 Sigmoid
名词解释:
- Sigmoid Function:S型函数
可以通过不同的w,b,c组成任意不同的S型函数
- 通过w改变斜坡度
- 通过b左右移动
- 通过c改变高度
也就可以找到所有需要的蓝色函数组成红色函数
1.3.7.3.2 ReLU
但是能看得出,若要ReLu完成一条hard sigmoid的线需要两个ReLU函数,以下比较
其中ReLU一般比较好一些
1.3.8 多天数据的复杂模型
举例考虑前三天的数据
1.3.8.1 sigmoid函数的参数部分
假设三个sigmoid函数,记为r
用矩阵表示即
算出r后继续运算,分别通过sigmoid函数
1.3.8.2 通过sigmoid函数
通过矩阵记为
1.3.8.运算得到y
1.3.8.4 总结
1.3.8.4.1 图示
1.3.8.4.2 线性代数表示
重新定义名词
所有未知参数统称θ,所以Loss函数变为Loss(θ),优化也同样
其中▽为对L的西塔各个偏导
但实现时一般是随机分组后优化
- 每一组优化结束叫一次update
- 所有组优化结束叫一次epoch
- Batch size也是一个hyperparameter
1.4 深度学习
1.4.1 多重激活函数
反复多做几次由一个hyperparameter决定,此时三层,观察Loss效果有提升
1.4.2 名词解释
上述的多重激活函数换一个名字
- 每一层叫一个Neuron(神经元)
- 综合叫Neural Network(神经网络)
但事实是,神经网络的名号已经臭了,而如今
- 每一层叫一个hidden layer
- 综合叫Deep
- 所以叫Deep Learning
1.4.3 为什么不更深
四层比三层训练时的误差更好,但是四层比三层测试时的误差更大
这就是发生了Overfitting(过拟合)
1.4.4 实操三步骤
1.4.4.1 步骤一:定义function set
不同的连接方式导致不同的网络结构,以下介绍全连接
全连接:layer与layer之间的neural两两都有连接
将操作都看作矩阵运算
其中σ(西格玛)为sigmoid()
通过并行可加速矩阵计算
举一个简单例子:输入一张图片,判断是什么数字
输入层用256个x记录每个像素是否被涂黑,输出层用10个y输出每个数字匹配的概率。
而layer和neuron的数目不定:靠试错法和直觉
1.4.4.2 步骤二:定义网络的好坏
通过标记target的和运算出的运算得到误差
算出所有误差的总和
接下来要做的就是:
- 找一个好function set最小化Loss
- 找一组好参数θ*最小化Loss
怎么做呢?答:Gradient Descent!!!
这么庞大怎么算Gradient?答:Backpropagation反向传播:使用导数链式法则
1.5 backpropagation反向传播
To compute the gradients efficiently, we use backpropagation.
基于导数链式求导法则,如下:
若设定z为模型函数,w为各个模型参数,C为损失函数
怎么求? 由链式求导法知
步骤分为forward pass和backward pass
1.5.1 forward pass
forward pass :计算,其中w要一个一个计算所有参数的
1.5.2 backward pass
backward pass:计算
- σ()=sigmoid() = ,是可以求的,
- 而和就更好求了,以z'举例,由于z' = a * w3 +...,故
- 故
- 现在只有和不已知了
最后的问题:求和
1.5.2.1 假设一:z'和z''已经是output layer
此时已经可以算出来了,以举例,同理。
- 与z'仅仅差一个定义的输出层函数,当然好求
- Cost()损失函数为自定义与相关的函数,当然好求
1.5.2.2 假设二:z'和z''还要作下一层的输入
反过来看这个网络,也就是按红色箭头来看,将和看作输入,以这个角度看σ'(z),由于z已经在forward pass中被确定(z不会变动了),所以σ'(z)是一个常数,正好组成下面的式子,能看作一个新的网络
使用上述提到的思路,反复下去,直到假设一output layer的情况
看起来很恐怖,求每一个都需要后续的那么多数据,但是其实不是
我们可以根据以上思路,从后向前整体再走一边
这个就叫backpropagation
1.6 Regularization
注意:regularization不考虑bias
在Loss中加上对属性的单独考量,因为我们追求一个smooth的function
平滑就是输入的变化对输出不要过于敏感
λ越大表示:考虑smooth更多,考虑error更少
我们追求smooth,但是也不要太smooth