机器学习—吴恩达_ 第8周_学习总结
21.10.25-21.10.31
👉周学习任务:
-
100% 回顾吴恩达机器学习:分类算法
-
80% 神经网络学习
[TOC]
一、回顾机器学习
机器学习:用已知的数据集通过数学模型使得程序能够像人一样的去思考,然后对未知数据做出预测
1.机器学习分类:有监督学习 & 无监督学习
- 有监督学习:有明确的数据,有明确的答案。常用于
分类问题
以及回归问题
。
-
无监督学习:不会告诉什么是错什么是对,只是被告知一堆数据,但是不知道干嘛,不知道类型,让机器自己找到答案。常用
聚类算法
。
2.逻辑回归模型
- Logistic 回归主要用于分类问题,下面是简单二分类,对于所给数据集假设存在这样的一条直线可以将数据完成线性可分。
- 较复杂的分类:通过不断地添加高项式使得分类趋向正确,但是会存在过拟合的现象。
- 对于已知的输入参数,其最后的结果只有0,1。其逻辑回归的函数为对数几率函数:== h θ ( x ) = 1 1 + e − θ T x h{_\theta}(x)=\frac{1}{1+e^{-\theta^T x}} hθ(x)=1+e−θTx1==和linear一样需要选取合适的参数达到更好的拟合。通过代换得 θ T x = ln y 1 − y \theta^Tx = \ln \frac {y}{1-y} θTx=ln1−yy =》 θ T x = − ln ( 1 − y ) + ln ( y ) \theta ^Tx=-\ln(1-y)+\ln(y) θTx=−ln(1−y)+ln(y) 可以得出 θ T x \theta ^Tx θTx的值越趋向无穷的时候 P ( Y = 1 ∣ x ) P(Y=1|x) P(Y=1∣x) 越接近1,或者,y从0->1的时候,x趋向$$(无穷)
- 使用线性回归模型的预测值逼近分类任务真实标记的对数几率,其优点有:
- 直接对分类的概率建模,无需实现假设数据分布,从而避免了假设分布不准确带来的问题(区别于生成式模型);
- 不仅可预测出类别,还能得到该预测的概率,这对一些利用概率辅助决策的任务很有用;
- 对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解。
- 代价函数:在逻辑回归模型中常常使用极大似然法求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大
衡量模型预测错误的程度,我们取整个数据集上的平均对数似然损失,我们可以得到代价函数为:
即
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) ln h θ ( x ( i ) ) + ( 1 − y ( i ) ) ln ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=- \frac{1}{m}[\sum_{i=1}^my^{(i)}\ln h_\theta(x^{(i)})+(1-y^{(i)})\ln(1-h_\theta(x^{(i)}))] J(θ)=−m1[∑i=1my(i)lnhθ(x(i))+(1−y(i))ln(1−hθ(x(i)))]
= − 1 m [ ∑ i = 1 m y ( i ) ( θ T x ) − ln ( 1 + e θ T x ) ] - \frac{1}{m}[\sum_{i=1}^my^{(i)} (\theta^Tx)-\ln(1+e^{\theta ^T x})] −m1[∑i=1my(i)(θTx)−ln(1+eθTx)]
-
在逻辑回归模型中,最大化似然函数和最小化损失函数实际上是等价的。
-
梯度下降:为了使得参数变化和代价函数关联起来,使用 θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta{_j}:=\theta{_j}-\alpha \frac{\partial J(\theta)}{\partial \theta{_j}} θj:=θj−α∂θj∂J(θ)对各个参数进行同步改值,其中== α \alpha α==为学习率,太大太小均不可。梯度下降的过程中,接近最优解的时候,偏导数会越来越接近0,那步长也就会越来越小,最终达到合适的权重值。一下为梯度下降算法的流程。
对代价函数求偏导得到:KaTeX parse error: Undefined control sequence: \part at position 8: \frac {\̲p̲a̲r̲t̲ ̲J(\theta)}{\par…
-
高级优化算法
-
多元分类思想:多次切割。
3.过拟合欠拟合
- 参数进行缩放。
4. 正则化
正则化是一个通用的算法和思想,所以会产生过拟合现象的算法都可以使用正则化来避免过拟合.
在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,可以有效提高泛化预测精度。如果模型过于复杂,变量值稍微有点变动,就会引起预测精度问题。正则化之所以有效,就是因为其降低了特征的权重,使得模型更为简单
正则化一般会采用 L1 范式或者 L2 范式
-
L1 正则化:LASSO 回归,相当于为模型添加了这样一个先验知识:权重服从零均值拉普拉斯分布。
-
L2 正则化:Ridge 回归,相当于为模型添加了这样一个先验知识:w 服从零均值正态分布。
-
线性回归的正则化
类似于正规方程中加入某一矩阵:
-
逻辑回归的正则化
-
L1 正则化就是在 loss function 后边所加正则项为 L1 范数,加上 L1 范数容易得到稀疏解(0 比较多)。
-
L2 正则化就是 loss function 后边所加正则项为 L2 范数的平方,加上 L2 正则相比于 L1 正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于 0(但不是等于 0,所以相对平滑)的维度比较多,降低模型的复杂度。
二、神经网络学习
让程序像大脑一样思考,模拟大脑的神经传递,将参数通过一层一层的映射关系传递到最后得到最终的结果
1.逻辑线性回归的代价函数和神经网络
2.前向传播
a j ( l ) a_j^{(l)} aj(l)表示第 l l l层的 j j j个结点的激活值,这个值通过激活函数sigmod计算得到。
z 1 2 = θ 0 + θ 1 x 1 1 + θ 2 x 2 1 z_1^{2}=\theta_0 +\theta_1 x_1^1+\theta_2 x_2^1 z12=θ0+θ1x11+θ2x21 第二层的z由第一层权重和 z z z通过激活函数得 a 2 a^2 a2 。 下图为计算 z 3 z^3 z3的图像。
3.使用反向传播最小化神经网络
δ j ( l ) \delta_j^{(l)} δj(l)代表了第 l l l层的 j j j个结点的误差 δ j ( l ) = a j l − y j \delta_j^{(l)}=a_j^{l}-y_j δj(l)=ajl−yj (激活项的误差)。同时也可以写成向量的形式: δ l = a ( l ) − y \delta^{l}=a^{(l)}-y δl=a(l)−y
上图公式含义:第三层参数的转置x第四层的误差项向量 点乘 激活函数g在输入值为 z 3 z^3 z3时所求的导数最后的值为如下图所示,同时误差层数不能算到第一层因为是输入层,没有意义。
实际上得到某一层的代价函数的偏导就等于 该层激活项乘以下一层的误差值。
- 假设输出项只有一项同时忽略正则化,提取出cost函数作为衡量预测值的准确度:
上图中得到其误差为cost对z的偏导,其含义:衡量的是为了影响这些中间值,我们改变神经网络中的权重的程度,进而影响输出函数h(x),并影响所有的代价函数
计算 δ 2 ( 2 ) = θ 12 ( 2 ) δ 1 ( 3 ) + θ 22 ( 2 ) δ 2 ( 3 ) \delta_2^{(2)}=\theta_{12}^{(2)} \delta_1^{(3)}+\theta_{22}^{(2)} \delta_2^{(3)} δ2(2)=θ12(2)δ1(3)+θ22(2)δ2(3) 其中 δ 2 ( 3 ) = θ 12 ( 3 ) δ 1 ( 4 ) \delta_2^{(3)}=\theta_{12}^{(3)} \delta_1^{(4)} δ2(3)=θ12(3)δ1(4)
4.梯度检测
取消了直接利用求导的法则去运算,而使用微分的概念去近似求值来对神经网络最后的模型进行梯度检测,确认梯度下降是正确的。在执行梯度下降的时候不要执行检测算法,因为检测算法的运算时间很慢。
5.随机初始化
在使用梯度下降等算法的时候,我们需要对 θ \theta θ 的值进行初始化,然后再进行梯度下降,所以就要选择合适的初始化值。
- 对称权重:均初始化为0时的情况:
- 随机权重:
6.总结
- 通常情况下:隐藏单元越多越多;输入参数数量因该和隐藏单元一致或者 隐藏单元是输入参数的n倍。
- 输出项存在多个分类的时候,将y写成对应的向量值。
- 神经网络一般的执行流程
- 1:初始化随机权重
- 2 : 实现前向传播,输入 x 并 可 通 过 函 数 x并可通过函数 x并可通过函数 h θ ( x ) h_\theta(x) hθ(x) 得到结果
- 3:实现代价函数 J ( θ ) J(\theta) J(θ)
- 4:反向传播计算代价函数的偏导数(循环)
- 5: 使用梯度检测进行检测是否正确
- 6:执行梯度下降函数
三、模型的选择和一些操作方法
1.数据集的处理
可以将数据集拆分成30%-70%比例,或者详细分为:训练集,交叉集,验证集。
2.模型的选择上
使用交叉集cv误差来选择模型。使用train训练模型,通过梯度下降之后,得到较好的参数;再使用cv数据集将这个参数代入,求出cv误差。
3.算法的偏差和方差导致过拟合问题
图像:多项式的次数和训练误差的图像,以及交叉误差的函数图像。
- 高方差的情况:训练集的误差很低,相当于过拟合,导致了交叉数据集中的误差很高。
4.使用正则化解决过拟合的问题(神经网络同)
在使用正则化的过程中,我们需要考虑 λ \lambda λ 的取值;通过一点一点的变化使得交叉集的误差最低。
- 正则化后的函数对比:当参数 λ \lambda λ 很小的时候,会发生过拟合现象,所以训练集的误差会很小,但是交叉验证的误差会很大;当参数很大的时候,会出现欠拟合现象,训练集的误差会变得很大,同时交叉验证的误差也会变大。所以引入了学习曲线
5.学习曲线
学习曲线只要是检查我们的算法是否正常,是出于偏差还是方差
案例:参数越多的时候,交叉验证会越好,但是训练集的误差会变大
- 高偏差:随着我们增加m,交叉误差不会减少,同时交叉误差和训练误差间距很小;导致算法无错误,结果无意义。
- 高方差:训练误差和交叉误差之间的间距很大,当参数越多的时候,会改善这个情况。随着参数个数的增加交叉验证的误差远大于训练集(下降)的误差。
四、一些度量方法
1.评估度量值:查准率(Precesion)和召回率recall
2.P/R的自动权衡
- F 1 S c o r e F_1Score F1Score
一元线性回归的简单模拟代码。
import numpy as np
import matplotlib.pyplot as plt
#数据的载入
data=np.genfromtxt("data.csv",delimiter=",")
x_data=data[:,0] #数据的切分
y_data=data[:,1]
plt.scatter(x_data,y_data)#数据的散点图
plt.show()
#学习率
lr=0.0001
#截距
b=0
#斜率
k=0
#最大的迭代次数
epochs=50
#最小二乘法 求代价函数
def compute_error(b,k,x_data,y_data):
totalError=0
for i in range(0,len(x_data)):
totalError+=(y_data[i]-(k*x_data[i]+b))**2
return totalError/float(len(x_data))/2.0
#梯度下降算法
def gradient_descent_runner(x_data,y_data,b,k,lr,epochs):
#计算总的数据量
m=float(len(x_data))
#循环
for i in range(epochs):
b_grad=0
k_grad=0
#计算梯度的总和再求平均
for j in range(0,len(x_data)):
#对theta0求导
b_grad+=-(1/m)*(y_data[j]-(k*x_data[j]+b))
#对theta1求导
k_grad+=-(1/m)*x_data[j]*(y_data[j]-(k*x_data[j]+b))
b-=(lr*b_grad)
#参数-学习率*偏导数
k -= (lr*k_grad)
#每一次迭代求出参数1和2的值
#每5次打印对应的图像
# if i%5==0:
# print("epochs:",i)
# plt.plot(x_data,y_data,'b.')
# plt.plot(x_data,k*x_data+b,'r')
# plt.show()
return b,k
print("Starting b={0},k={1},error={2}".format(b,k,compute_error(b,k,x_data,y_data)))
print("running...")
b,k=gradient_descent_runner(x_data,y_data,b,k,lr,epochs)
print("After{0} iterations b={1},k={2},error={3}".format(epochs,b,k,compute_error(b,k,x_data,y_data)))
#画图
plt.plot(x_data,y_data,'b.')
plt.plot(x_data,k*x_data+b,'r')
plt.show(