从上次南大静态分析搞完之后,就说博客再也不写学习笔记了。 于是,我就很久没有更新了...
算了, 还是把博客搞成学习笔记本好了...xD
李宏毅老师的机器学习课程非常的棒,我一定要好好学习....
定义
对于机器学习可以理解成:

其实就是约等于一个找函数的能力, 如:
语音辨识(Image Recognition):
这里的声音信号做为输入, 而对应的文字作为输出。 这种函数会非常的复杂, 因此我们期望通过机器把它找出来。
图像识别(Image Recognition):
同理图像识别图片是输入,输出是图片的内容。
等等...
专有名词介绍
Regression
: The function outputs a scalar.
如上图所示,是一个回归(Regression)任务,此函数输入是今天已知的与输出有关的各种参数, 输出是对于明天PM2.5指数的预测。
Classification
: Given options(classes), the function outputs the correct one.
Classification是做选择题:
如上图,一个函数帮我们甄别是否一封邮件是垃圾邮件。他的输入就是一封电子邮件,输出是一个选项(选项是提前设定好的)。 选项可以有多个, 如:
Playing Go 也是一个Classification, 他有19*19(棋盘大小)个选项。
- Structured Learning: 除了Regression和Classification以外,如机器不止是产生一个数字或者做一个选择题。 他需要Create something with structure(e.g., image, document),那么就称为Structured Learning(让机器学会创造)
Case Study
来直观的看一下如何通过机器学习解决问题。
老师的YouTube地址: https://www.youtube.com/c/HungyiLeeNTU
后台记录了每一天的观看人数等数据。 现在, 老师想找到一个function,他能够帮我们预测今天有多少人会观看老师的频道。 机器学习找这个function,需要三个步骤:
1. Function with unknown parameters
写出一个带有未知参数(unknow parameters)
的函数:
我们来猜测一下, 我们要找的数学式是: \[ y = b+wx_1 \] 这个带有unknown parameters的函数我们就称为模型(Model)。
其中y
是我们所需要的预测的,当天观看频道的总人数。 而x1
是我们输入的,已知的昨天观看该频道的人数。
而b
和w
就是unknow parameters。其中b
定义为bias
, 而w
定义为weight
。
这个model不一定是对的,等下会有修正。
2. Define Loss from Training Data
第二步骤, 定义一个Loss Function: \[
L(b, w)
\] L的输入就是我们model里的参数b
跟w
; 输出是一个代表了model使用改组参数的好坏。
假设现在设置: \[ L(0.5k, 1) \] 那么我们的model就变为: \[ y = b+ wx_1 \rightarrow y=0.5k +1x_1 \] 那么如何衡量目前这个已定参数的model有多好呢?就需要使用Loss Function。
我们需要从训练资料中找答案:
如上图中, 使用我们已定的model去计算已知的,从2017/01/01到2020/12/30日的数据。 我们都可以将每一天的数值带入model, 得到隔天的估测数据,然后计算与真实值的误差来衡量model: \[ e_2 = \vert y-\hat{y}\vert = 2.1k \]
每一天的真实数值就叫做Label
如e2代表我们对2017/01/02的估值。 我们可以依次算出三年的训练资料的误差:
这个L越大效果越差, 越小效果越小。
这种依据绝对值求Loss的方法叫做MAE
, 而使用平方和求Loss的方法叫做MSE
:
两种求误差的方法根据需求选择。
经过作者对Model进行一系列的调参后的真实结果, 在穷举各种w
和b
后,使用真实数据计算出来的Loss结果。各种组合的Loss表示为上边的等高线图,越偏红色, 表示计算出的Loss越大, w
跟b
放入mdoel,效果越差。可以看到估测最准的大约在w
在1,b在100左右。
3. Optimization
第三步是解一个最佳化的问题, 找到一组最好的w
跟b
(w*
, b*
),可以让Loss的值最小 :
此门课程中唯一用到的Optimization方法是Gradient Descent
。
上大图:
如图, 为了简化期间, 假设我们已知参数b
, 只有一个参数w
未知。 当w
在不同的数值的时候, 就会得到不同的Loss, 由于简化为只有一个参数, 所以是一条曲线(1D)。
现在的问题是, 如何找到一个w
, 使得Loss
的值最小?
首先, 我们随机选择一个随机的点w0
。 接下来计算, 当w=w0
时, w
这个参数对L
的微分。 即使计算w0
点的error surface
的切线斜率。如果是Negative
就Increase w
, 反之。
如图就是猴子哥现在的位置。猴子哥站在那里, 看到左高右低,就向右Increase w
。
再来一张图,此时猴子哥移动了一段位置,由w0
到了w1
, 这段距离还依赖于一个参数η
, 这个参数是认为设定的learning rate
。
在机器学习中, 自己设定的值,就叫做hyperparameters
继续反复操作, 最后停下了: 两种情况下停下了: 1)到上限了(hyperparameters) 2) 到达极值点
如图假设我们移动到了Local minima
的位置停止了, 那么, 我们其实没有到达真正最好的, 可以让Loss
最小的w
(global minima)。但是实际上,这是一个假问题(不是实际中真正的痛点)。
以上例子只有一个参数w
。 那么有w
, 跟b
如何做Gradient Descent
呢?
给定随机初始值
w0
,b0
分别在初始位置计算
w
和b
对L
的微分更新
w
跟b
,得到w1
跟b1
迭代更新, 找到
w*
跟b*
将w
跟b
结合起来,得到箭头的方向,一直移动...
算出来的w*=0.97
, b*=0.1k
, Loss=0.48K
(观看误差大约500人)。
我们以上的三个步骤, 叫做训练。 我们真正要做的是, 对未来的未知的观看次数的预测。
如图我们发现在2021的误差值是0.58。因此在位置的数据上, 误差相对较大。
如何再缩小误差, 分析结果:
蓝色的线几乎是红色向右平移,因为这个model只参考前一天的结果。 找规律, 发现有每七天一个循环
,也许使用一个参考7天的model结果会更准确。修改模型
对模型的修改往往来自于对问题的理解(Domain Knowledge)
第二个模型,将7天的数据,都列入考虑。我们得到了一个更低的Loss
(0.38k)。这个模型中计算了前七天的wjxj
, 每一个w
跟b
都用Gradient Descent计算,来看每一天的w*
,让L
减小的是w2, w4, w5
为负值。
以此类推考虑更多天...28天...56天...Loss
在没有看过的资料上还是0.46k
。
这种将x(feature)乘上一个weight, 再加上bias得到预测结果的模型, 叫做Linear models
。
下一讲介绍如何将linear model做到更好。