学习资源
视频:李宏毅深度学习完整版
别人的中文笔记:
李宏毅机器学习笔记(LeeML-Notes)
李宏毅机器学习笔记(LeeML-Notes) - github地址
不这这个笔记跟我看的上面的视频不是同一个,可能目录排版有区别:
视频:李宏毅《机器学习》
我是比较推荐看上面这份别人的笔记的,说是笔记其实更像是视频的文字版,视频的录音质量很差,声音忽大忽小,而且比较尖锐有点伤听力,所以我推荐直接看文字版更快更直接,有看不懂的再去找对应视频结合来看。
笔记
P1P1ML Lecture 1_ Regression - Case Study
第一节课非常重要。
Linear model 线性模型:
: weight,权重
: bias,偏置
: an attribute of input x (feature特征),输入的各种不同的属性即特征。
Loss Function L:
Input: a function, output: how bad it is.
表示正确的结果的值,
表示第n只宝可梦的cp值。
即是我们预测出的值。
所以整个式子的意思就是把每一组的正确结果值与预测值的差算出平方,然后再把所有的正确与预测差的这个平方值加在一起。
然后我们要找到一个最好的Function:
的意思是使后面这个式子达到最小值时的变量的取值。
所以上式的意思就是找到一个function使Loss function最小。
由决定,所以:
使用Gradient Descent梯度下降来解上式方程:
读作eta。表示learning rate,即学习率。
对上式使用微分的连锁律公式:
连锁律公式:
得到:
解析后面一项:
对微分时:
对微分时
读作partial,意思是偏导的意思。
Overfitting: 过拟合。
Regularization: 正则:
做Regularization是为了得到更平滑的Function。
读作:lambda。是个常数。
P2 P2ML Lecture 3-1_ Gradient Descent
Gradient Descent
其中:,
做梯度下降的过程:
用原参数减去偏微分跟学习率的积得到新的参数,然后一直迭代。
要小心调节学习率,做梯度下降时可视化loss结果来辅助调节学习率。
通常学习率是随着参数的更新越来越小。
优化方法AdaGrad:
每个参数都有不同的learning rate,
读作sigma。是过去所有的微分值的root mean square即均方根误差。
Stochastic Gradient Descent:
Stochastic: 随机的意思。
正常的梯度下降是先求总的loss,再进行梯度下降。
随机梯度下降是每次随机取一个example 计算loss后就进行梯度下降。
Feature Scaling:
特征缩放。
dimension:维度。
**Taylor Series: **
泰勒级数。
P3 P3ML Lecture 3-2_ Gradient Descent (Demo by AOE)
没啥可看。以《帝国时代》地图举例,我们永远不知道找到的local minimize是不是最小的local minimize。
P4 P4ML Lecture 3-3_ Gradient Descent (Demo by Minecraft)
没啥可看。以《我的世界》举例,梯度下降法在某个时间的loss不降反升。
P5 P5ML Lecture 1_ Regression - Demo
python例子做梯度下降。
这个例子对于理解上面的P1,P2课程内容非常有帮助,需要仔细研究。
例子我增加了一些注释。
1. 未特制化learning rate的源码:
import numpy as np
import matplotlib.pyplot as plt # plt
# wbt解析:
# 调节缩小lr,一开始还是有用的,但是到后来会overfitting,所以请参看使用特制lr顺利收敛的lhy1.2.py。
# 特制lr的修改:
# 对 b 和 w 给予特制化的Learning Rate:
# 学习率 lr 改为 1,lr_b = 0; lr_w = 0 ;
# 对b、w定制化的学习率lr,采用Adagard
# b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633,619, 393, 428, 27, 193, 66, 226, 1591]
# ydata = b + w*xdata # 公式
# np.arange函数用于创建等差数组,参数:
# start:可忽略不写,默认从0开始;起始值
# stop:结束值;生成的元素不包括结束值
# step:可忽略不写,默认步长为1;步长
# dtype:默认为None,设置显示元素的数据类型
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y))) # 生成len(x)行len(y)列的零矩阵
# X,Y = np.meshgrid(x, y) # 生成网格点坐标矩阵, 代码其实没用到。
# Z用来画等高线的
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2
Z[j][i] = Z[j][i]/len(x_data)
# ydata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 0.0000001 # learning rate
iteration = 100000
# store initial values for plotting
b_history = [b]
w_history = [w]
# iterations
for i in range(iteration): #进行10万次迭代
b_grad = 0.0
w_grad = 0.0
# 计算所有loss,并且把所有loss相加
for n in range(len(x_data)):
# 2.0*(y_data[n] - b - w*x_data[n])*1.0 套用使用微分连锁律公式后的结果计算loss
# b_grad -, 使用减号是因为后面原本是-1.0,把负号提取出来到前面了
b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
# 2.0*(y_data[n] - b - w*x_data[n])*x_data[n] 套用使用微分连锁律公式后的结果计算loss
# b_grad -, 使用减号是因为后面原本是-x_data[n],把负号提取出来到前面了
w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]
# 更新参数: P2 P2ML Lecture 3-1_ Gradient Descent笔记的图1的公式
# update parameters
b = b - lr*b_grad
w = w - lr*w_grad
# store parameters for plotting
b_history.append(b)
w_history.append(w)
# plot the figure
#plt.contourf: 填充等高线
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
# 李宏毅课程原代码为markeredeweight=3,无法运行,改为了marker=3。
# ms和marker分别代表指定点的长度和宽度。
plt.plot([-188.4], [2.67], 'x', ms=6, marker=6, color='orange') # 目标点
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')# 梯度下降的路线图
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
2. 特制化learning rate后顺利收敛的源码:
import numpy as np
import matplotlib.pyplot as plt # plt
# wbt解析:
# 特制lr的修改:
# 对 b 和 w 给予特制化的Learning Rate:
# 学习率 lr 改为 1,lr_b = 0; lr_w = 0 ;
# 对b、w定制化的学习率lr,采用Adagard
# b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633,619, 393, 428, 27, 193, 66, 226, 1591]
# ydata = b + w*xdata # 公式
# np.arange函数用于创建等差数组,参数:
# start:可忽略不写,默认从0开始;起始值
# stop:结束值;生成的元素不包括结束值
# step:可忽略不写,默认步长为1;步长
# dtype:默认为None,设置显示元素的数据类型
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y))) # 生成len(x)行len(y)列的零矩阵
# X,Y = np.meshgrid(x, y) # 生成网格点坐标矩阵, 代码其实没用到。
# Z用来画等高线的
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2
Z[j][i] = Z[j][i]/len(x_data)
# ydata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 1 # 0.0000001 # learning rate
iteration = 100000
# store initial values for plotting
b_history = [b]
w_history = [w]
# 对b、w定制化的学习率lr
lr_b = 0
lr_w = 0
# iterations
for i in range(iteration): #进行10万次迭代
b_grad = 0.0
w_grad = 0.0
# 计算所有loss,并且把所有loss相加
for n in range(len(x_data)):
# 2.0*(y_data[n] - b - w*x_data[n])*1.0 套用使用微分连锁律公式后的结果计算loss
# b_grad -, 使用减号是因为后面原本是-1.0,把负号提取出来到前面了
b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
# 2.0*(y_data[n] - b - w*x_data[n])*x_data[n] 套用使用微分连锁律公式后的结果计算loss
# b_grad -, 使用减号是因为后面原本是-x_data[n],把负号提取出来到前面了
w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]
# 更新参数: P2 P2ML Lecture 3-1_ Gradient Descent笔记的图1的公式
# update parameters
# b = b - lr*b_grad
# w = w - lr*w_grad
#Adagard公式参看:P2 P2ML Lecture 3-1_ Gradient Descent笔记的图5
# 对b、w定制化的学习率lr,采用Adagard
lr_b = lr_b + b_grad ** 2
lr_w = lr_w + w_grad ** 2
# update parameters
# 对b、w定制化的学习率lr,采用Adagard
b = b - lr / np.sqrt(lr_b) * b_grad
w = w - lr / np.sqrt(lr_w) * w_grad
# store parameters for plotting
b_history.append(b)
w_history.append(w)
# plot the figure
#plt.contourf: 填充等高线
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
# 李宏毅课程原代码为markeredeweight=3,无法运行,改为了marker=3。
# ms和marker分别代表指定点的长度和宽度。
plt.plot([-188.4], [2.67], 'x', ms=6, marker=6, color='orange') # 目标点
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')# 梯度下降的路线图
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
看代码进一步了解到:
迭代的目的:
10万次迭代是为了不断执行梯度下降使bias, weight, learning rate不断更新趋近目标。
P6 P6ML Lecture 0-2_ Why we need to learn machine learning_
没啥可看,可以跳过。
P7 P7The Next Step for Machine Learning
可以不看也可以看看玩。
P8 P8ML Lecture 2_ Where does the error come from_
这节课跟概率相关。
可以跟这篇一起看:理解Bias(偏差),Error(误差),和Variance(方差)的区别和联系?
Bias(偏差)反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度。
Variance(方差)反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。在概率论和统计学中方差是衡量随机变量或一组数据时离散程度的度量。
一、Bias和模型复杂度的关系:当模型复杂度上升时,Bias减小。当模型复杂度降低时,Bias增加。(反比关系)
二、Variance和模型复杂度的关系:当模型复杂度低时,Variance更低,当模型复杂度高时,Variance更高。(正比关系)
实际情景中我们怎么判断自己的模型是Bias大还是Variance大呢,这个就要看到底是你的模型无法尽量大的拟合你的样本还是你的模型高度拟合你的样本但是用测试数据算时误差又很大。前者就是应该bias大导致的,也就是模型复杂度太低导致的。后者就是因为模型复杂度高导致Variance高导致的。
偏差Bias,方差Variance:
Large Bias,Small Variance集中但偏离目标。欠拟合。
解决办法:
1. 重写model添加更多的参数.
2. 更复杂的model。
Small Bias,Large Variance离目标近虽然不能都命中红心但是平均后接近红心。过拟合。
解决办法:
1. 更多的数据,但是现实可能没有那么多数据,可以根据对问题的理解自己模拟数据。
2. Regularization:使曲线更平滑。
Public Testing Set的err一般大于Private Testing Set。
Training Set分成多份分组Traning Set和Validation,然后计算出多个model的结果,取平均错误最小的也就是最好的结果。
P9 P9ML Lecture 4_ Classification
分类Classification。
使用高斯分布即正态分布。