Machine Learning Notes
Published in:2023-11-25 |

Course 1

监督学习:输入特征x,输出目标y。对数据集进行预测,分为回归分类

无监督学习:输入特征x,没有目标y,对数据集进行聚类预测异常检测降维

线性回归

yi=wxi+by^i = wx^i+b

定义损失函数(成本函数),需要最小化损失函数

J(w,b)=12mi=1m(yiy^)2J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} {(y^i-\hat{y})}^2

其中yiy^i为真实输出,y^\hat{y}为预测输出

  • 为了不让数据集变大而损失也变大,故采用平均平方误差而不是总平方误差
  • 1/2是为了方便求导计算

梯度下降

需要最小会损失函数,需要使用梯度下降算法

定义学习率learning_rateα\alpha,一般α[0,1]\alpha \subseteq [0,1]

w=wαJ(w,b)ww = w- \alpha \frac{\partial{J(w,b)}}{\partial{w}}

b=bαJ(w,b)bb = b- \alpha \frac{\partial{J(w,b)}}{\partial{b}}

  • 梯度下降时建议同步梯度下降,如下图左

pic-1

如果α\alpha太小,可以得到答案,但是时间过长

如果α\alpha太大,大交叉无法收敛,甚至发散

当参数值每次更新时,J(w,b)J(w,b)变小,导数项(斜率)也会变小,对于固定学习率α\alpha,步长也会变小,从而达到局部最优解

对导数项分别求导

J(w,b)w=1mi=1m(f(xi)yi)xi\frac{\partial{J(w,b)}}{\partial{w}} = \frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)x^i

J(w,b)b=1mi=1m(f(xi)yi)\frac{\partial{J(w,b)}}{\partial{b}} = \frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)

其中f(xi)=wxi+bf(x^i) = wx^i+b

对于线性回归损失,他的损失函数图像是一个凹函数,只有一个全局最小值,没有局部最小值

选择合适得到学习率,就可以得到min(J(w,b))min(J(w,b))

线性回归的梯度下降也是batch gradient descent,批次梯度下降每次更新关心整批的训练样例

多元线性回归

假设特征有nn个,定义x=[x1x2x3...]\vec{x} = \begin{bmatrix} x_1 & x_2 & x_3 & ... \end{bmatrix},参数w=[w1w2w3...]\vec{w} = \begin{bmatrix} w_1 & w_2 & w_3 & ... \end{bmatrix}

fw,b=wx+bf_{\vec{w},b}=\vec{w} \cdot \vec{x} +b

·为两个向量的点积(dot)。wx=w1x1+w2x2+....+wnxn\vec{w} \cdot \vec{x} = w_1*x_1+w_2*x_2+....+w_n*x_n

矢量化:利用计算机的并行硬件,代码简洁、运行速度快

1
f = np.dot(w, x) + b

多元线性回归的梯度下降

pic-2

PS: 正规方程:某些机器学习库在后端求w,bw,b的方法,只适用于线性回归,而且速度慢,不要求掌握

特征缩放

不同特征的估计值范围差异很大,梯度下降等高线图可能某些轴范围宽某些窄,梯度下降过程中可能波 动

加快梯度下降速度

避免特征的取值范围差异过大,将其进行缩放,几种常见方法:

  • 除以最大值x1,scale=x1maxx_{1,scale} = \frac{x_1}{max}x[0,1]x \in [0,1]
  • 均值归一化Mean Normalization
    • 求均值μ\mu
    • x1=x1μmaxminx_1 = \frac{x_1-\mu}{max-min}
  • Z-score归一化
    • 求标准差σ\sigma,均值μ\mu
    • x1=x1μσx_1 = \frac{x_1-\mu}{\sigma}

**判断梯度下降是否收敛:**1. 观察iteration-loss曲线是否平稳 2. 自动收敛测试,当loss小于一个很小的值时停止(难用)

选择合适学习率:从0.001开始,每次乘以3,对比J(w,b)J(w,b)与迭代次数的关系,选择合适的α\alpha

特征工程

利用知识和直觉设计新特征,通常通过转化与组合,使模型做出更准确的预测

多项式回归:可以添加xqx^q项更好地拟合数据图像,f(x)=w1x3+w2x2+w1x1+bf(x)=w_1x^3+w_2x^2+w_1x^1+b

此时特征缩放尤为重要

分类-逻辑回归

解决二分类问题

sigmoid函数

输出介于(0,1)(0,1)

g(z)=11+ez,zRg(z)= \frac{1}{1+e^{-z}},z \subseteq R

logistic regression:

fw,b(x)=g(wx+b)=11+e(wx+b)f_{\vec{w},b}(\vec{x})=g(\vec{w} · \vec{x}+b) = \frac{1}{1+e^{-(\vec{w} · \vec{x}+b)}}

输出值可以理解为分类为1的可能性

fw,b(x)=P(y=1x;w,b)f_{\vec{w},b}(\vec{x})=P(y=1|\vec{x};\vec{w},b)

决策边界decision boundary

以0.5作为阈值,当wx+b0\vec{w} · \vec{x}+b \ge 0,取值1;当wx+b<0\vec{w} · \vec{x}+b <0,取值0

wx+b=0\vec{w} · \vec{x}+b = 0称为决策边界

多项式回归也适用于非线性的决策边界

成本函数

如果使用平方误差成本函数,有多个局部最小值,J(w,b)J(w,b)不是凹函数,不适用于逻辑回归

定义J(w,b)=1mi1mL(fw,b(x(i),y(i))J(w,b)=\frac{1}{m}\sum_{i-1}^{m}L(f_{w,b}(x^{(i)},y^{(i)})

其中L代表单个样例的loss,J代表总的cost

L(fw,b(x(i),y(i))=log(fw,b(x(i)))ify(i)=1L(f_{w,b}(x^{(i)},y^{(i)})=-log(f_{w,b}(x^{(i)})) \quad if \quad y^{(i)}=1

pic-4

当y等于1,预测值越靠近1损失越小

L(fw,b(x(i),y(i))=log(1fw,b(x(i)))ify(i)=0L(f_{w,b}(x^{(i)},y^{(i)})=-log(1-f_{w,b}(x^{(i)})) \quad if \quad y^{(i)}=0

pic-5

当y等于0,预测值越靠近0损失越小

简化成本函数

L(fw,b(x(i),y(i))=y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))L(f_{w,b}(x^{(i)},y^{(i)})=-y^{(i)} log(f_{w,b}(x^{(i)})) - (1-y^{(i)})log(1-f_{w,b}(x^{(i)}))

得到

J(w,b)=1m(y(i)log(fw,b(x(i)))+(1y(i))log(1fw,b(x(i))))J(w,b) = -\frac{1}{m} (y^{(i)} log(f_{w,b}(x^{(i)})) + (1-y^{(i)})log(1-f_{w,b}(x^{(i)})))

成本函数是凹函数,便于实现梯度下降

梯度下降

对导数项分别求导

J(w,b)w=1mi=1m(f(xi)yi)xi\frac{\partial{J(w,b)}}{\partial{w}} = \frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)x^i

J(w,b)b=1mi=1m(f(xi)yi)\frac{\partial{J(w,b)}}{\partial{b}} = \frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)

其中f(xi)=11+e(wx+b)f(x^i) = \frac{1}{1+e^{-(\vec{w} · \vec{x}+b)}}

可以使用相似方法进行特征缩放

过拟合问题

过拟合虽然可能完美通过训练集,但是有高方差。应该避免欠拟合(高偏差)和过拟合(高方差)。

解决过拟合

  • 收集更多训练数据
  • 选择特征的一个子集
  • 正则化:减小参数wjw_j的值

正则化

如果不知道哪个特征是重要的,惩罚所有特征,防止过拟合

J(w,b)=12mi=1m(yiy^)2+λαmj=1nwj2J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} {(y^i-\hat{y})}^2 + \frac{\lambda}{\alpha m}\sum_{j=1}^{n} {w_j}^2

其中λ\lambda为正则化参数,α\alpha为学习率,缩放得

J(w,b)=12mi=1m(yiy^)2+λ2mj=1nwj2J(w,b) = \frac{1}{2m} \sum_{i=1}^{m} {(y^i-\hat{y})}^2 + \frac{\lambda}{2 m}\sum_{j=1}^{n} {w_j}^2

参数bb是否正则化无关紧要

需要选择合适的λ\lambda

  • 正则化线性回归

J(w,b)J(w,b)求偏导不断同步更新w,b的值

J(w,b)w=1mi=1m(f(xi)yi)xi+λmj=1mwj\frac{\partial{J(w,b)}}{\partial{w}} = \frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)x^i+\frac{\lambda}{m}\sum_{j=1}^{m}{w_j}

w=wα(1mi=1m(f(xi)yi)xi+λmj=1mwj)=(1αλm)w+.....w = w- \alpha (\frac{1}{m} \sum_{i=1}^{m} (f(x^i)-y^i)x^i+\frac{\lambda}{m}\sum_{j=1}^{m}{w_j}) = (1-\alpha \frac{\lambda}{m})w+.....

  • 正则化逻辑回归

J(w,b)=1m(y(i)log(fw,b(x(i)))+(1y(i))log(1fw,b(x(i))))+λ2mj=1nwj2J(w,b) = -\frac{1}{m} (y^{(i)} log(f_{w,b}(x^{(i)})) + (1-y^{(i)})log(1-f_{w,b}(x^{(i)})))+ \frac{\lambda}{2 m}\sum_{j=1}^{n} {w_j}^2

求导式和线性回归相同,只是需要注意

f(xi)=11+e(wx+b)f(x^i) = \frac{1}{1+e^{-(\vec{w} · \vec{x}+b)}}

Course 2

神经网络

起源于设计算法来模拟人脑活动,21世纪定义为深度学习

输入层->隐藏层->输出层

网络层

每一层输入向量x\vec{x}ai1\vec{a}_{i-1},经过当前层中多个逻辑回归处理,输出新的向量a[l]\vec{a}^{[l]},进入到下一层/输出结果

aj[l]=g(wj[l]a[l1]+bj[l])a_j^{[l]} = g(\vec{w}_j^{[l]} \cdot \vec{a}^{[l-1]} + b_j^{[l]})

j表示单元序号,l表示层数,g(x)g(x)sigmod函数

前向传播

从输入初步传递到输出,即为前向传播

一般实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def dense(a_in, W, b, g):
units = W.shape[1]
a_out = np.zeros(units)
for j in range(units):
w = W[:, j]
z = np.dot(w, a_in) + b
a_out[j] = g(z)
return a_out
def sequential(x):
a1 = dense(x, W1, b1)
a2 = dense(a1, W2, b2)
a3 = dense(a2, W3, b3)
f_x = a3
return f_x

使用框架进行矢量化加速

模型训练步骤

  1. 指定如何在给定输入X和参数的情况下计算输出
  2. 指定损失函数
  3. 训练模型以最小化损失函数

二元交叉熵损失

L(fw,b(x(i),y(i))=y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))L(f_{w,b}(x^{(i)},y^{(i)})=-y^{(i)} log(f_{w,b}(x^{(i)})) - (1-y^{(i)})log(1-f_{w,b}(x^{(i)}))

通过反向传播计算偏导数

激活函数

ReLU函数代替sigmoid激活,g(z)=max(0,z)g(z) = max(0,z)

pic-3

如何选择合适的激活函数?

取决于要预测的y

  • 二分类/回归中y可正可负 ——> sigmoid
  • 回归中y大于等于0 ——> ReLU
  • 对于隐藏层建议使用ReLU

ReLU常用且更快

为什么需要激活函数?

如果不使用(即使用线性的),得到的结果显然可以仅仅使用线性回归或者逻辑回归求解

多分类问题

softmax回归算法

zi=w1xi+biz_i=\vec{w_1}·\vec{x_i}+b_i

a1=ez1ez1+...+ezn=P(y=1x)a_1=\frac{e^{z_1}}{e^{z_1}+...+e^{z_n}} = P(y=1|\vec{x})

即,设有N个分类

zi=w1xi+biz_i=\vec{w_1}·\vec{x_i}+b_i

ai=ezik=1Nezi=P(y=ix)a_i = \frac{e^{z_i}}{\sum_{k=1}^{N} e^{z_i}}=P(y=i|\vec{x})

a1+a2+...+aN=1a_1+a_2+...+a_N=1

softmax损失函数

loss(a1,a2,...,aN,y)={log(a1)ify=1log(a2)ify=2...log(aN)ify=Nloss(a_1,a_2,...,a_N,y) = \left\{\begin{matrix} -log(a_1) \quad if \quad y=1\\ -log(a_2) \quad if \quad y=2 \\ ... \\ -log(a_N) \quad if \quad y=N \end{matrix}\right.

softmax改进

不先计算出aia_i,再带入损失函数

而是直接loss=log(ez1ez1+...+ezN)loss=-log(\frac{e^{z_1}}{e_{z_1}+...+e_{z_N}})

1
model.compile(loss=SparseCategoricalCrossEntropy(from_logits=True))

多标签分类

将每个标签分为一个二分类问题,容易混淆

高级优化方法

Adam

可以自动调整学习率α\alpha

对于每个参数都有一个α\alpha

其他的网络层

卷积层

  • 加快计算速度
  • 需要更少的数据,不容易过拟合

有多个卷积层,即卷积神经网络

每一层的单元只查看输入的一部分

Prev:
AI面经
Next:
Hello World