台大深度学习2021-1

从上次南大静态分析搞完之后,就说博客再也不写学习笔记了。 于是,我就很久没有更新了...

算了, 还是把博客搞成学习笔记本好了...xD

李宏毅老师的机器学习课程非常的棒,我一定要好好学习....

定义

对于机器学习可以理解成:

image-20210707203503647

其实就是约等于一个找函数的能力, 如:

  • 语音辨识(Image Recognition):

    image-20210707203601984

这里的声音信号做为输入, 而对应的文字作为输出。 这种函数会非常的复杂, 因此我们期望通过机器把它找出来。

  • 图像识别(Image Recognition):

    image-20210707203916147

同理图像识别图片是输入,输出是图片的内容。

等等...


专有名词介绍

  • Regression: The function outputs a scalar.

    image-20210707204151325

如上图所示,是一个回归(Regression)任务,此函数输入是今天已知的与输出有关的各种参数, 输出是对于明天PM2.5指数的预测。

  • Classification: Given options(classes), the function outputs the correct one.

Classification是做选择题:

image-20210707204729572

如上图,一个函数帮我们甄别是否一封邮件是垃圾邮件。他的输入就是一封电子邮件,输出是一个选项(选项是提前设定好的)。 选项可以有多个, 如:

image-20210707205158308

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

image-20210707205846249

后台记录了每一天的观看人数等数据。 现在, 老师想找到一个function,他能够帮我们预测今天有多少人会观看老师的频道。 机器学习找这个function,需要三个步骤:

1. Function with unknown parameters

写出一个带有未知参数(unknow parameters)的函数:

image-20210707210146306

我们来猜测一下, 我们要找的数学式是: \[ y = b+wx_1 \] 这个带有unknown parameters的函数我们就称为模型(Model)。

其中y是我们所需要的预测的,当天观看频道的总人数。 而x1是我们输入的,已知的昨天观看该频道的人数。

bw就是unknow parameters。其中b定义为bias, 而w定义为weight

这个model不一定是对的,等下会有修正。

2. Define Loss from Training Data

第二步骤, 定义一个Loss Function: \[ L(b, w) \] L的输入就是我们model里的参数bw; 输出是一个代表了model使用改组参数的好坏。

假设现在设置: \[ L(0.5k, 1) \] 那么我们的model就变为: \[ y = b+ wx_1 \rightarrow y=0.5k +1x_1 \] 那么如何衡量目前这个已定参数的model有多好呢?就需要使用Loss Function。

我们需要从训练资料中找答案:

image-20210708204015376

如上图中, 使用我们已定的model去计算已知的,从2017/01/01到2020/12/30日的数据。 我们都可以将每一天的数值带入model, 得到隔天的估测数据,然后计算与真实值的误差来衡量model: \[ e_2 = \vert y-\hat{y}\vert = 2.1k \]

每一天的真实数值就叫做Label

如e2代表我们对2017/01/02的估值。 我们可以依次算出三年的训练资料的误差:

image-20210708205313401

这个L越大效果越差, 越小效果越小。

这种依据绝对值求Loss的方法叫做MAE, 而使用平方和求Loss的方法叫做MSE:

image-20210708205441134

两种求误差的方法根据需求选择。

image-20210708205619696

经过作者对Model进行一系列的调参后的真实结果, 在穷举各种wb后,使用真实数据计算出来的Loss结果。各种组合的Loss表示为上边的等高线图,越偏红色, 表示计算出的Loss越大, wb放入mdoel,效果越差。可以看到估测最准的大约在w在1,b在100左右。

3. Optimization

第三步是解一个最佳化的问题, 找到一组最好的wb(w*, b*),可以让Loss的值最小 :

image-20210709202254891

此门课程中唯一用到的Optimization方法是Gradient Descent

上大图:

image-20210709202351925

如图, 为了简化期间, 假设我们已知参数b, 只有一个参数w未知。 当w在不同的数值的时候, 就会得到不同的Loss, 由于简化为只有一个参数, 所以是一条曲线(1D)。

现在的问题是, 如何找到一个w, 使得Loss的值最小?

首先, 我们随机选择一个随机的点w0。 接下来计算, 当w=w0时, w这个参数对L的微分。 即使计算w0点的error surface的切线斜率。如果是NegativeIncrease w, 反之。

如图就是猴子哥现在的位置。猴子哥站在那里, 看到左高右低,就向右Increase w

image-20210709203107456

再来一张图,此时猴子哥移动了一段位置,由w0到了w1, 这段距离还依赖于一个参数η, 这个参数是认为设定的learning rate

在机器学习中, 自己设定的值,就叫做hyperparameters

继续反复操作, 最后停下了: 两种情况下停下了: 1)到上限了(hyperparameters) 2) 到达极值点

image-20210709203845841

如图假设我们移动到了Local minima的位置停止了, 那么, 我们其实没有到达真正最好的, 可以让Loss最小的w(global minima)。但是实际上,这是一个假问题(不是实际中真正的痛点)。

以上例子只有一个参数w。 那么有w, 跟b如何做Gradient Descent呢?

  • 给定随机初始值 w0, b0

  • 分别在初始位置计算wbL的微分

  • 更新wb,得到w1b1

    image-20210709204432226

  • 迭代更新, 找到w*b*

image-20210709204603236

wb结合起来,得到箭头的方向,一直移动...

算出来的w*=0.97, b*=0.1k , Loss=0.48K(观看误差大约500人)。

我们以上的三个步骤, 叫做训练。 我们真正要做的是, 对未来的未知的观看次数的预测。

image-20210709204838642

如图我们发现在2021的误差值是0.58。因此在位置的数据上, 误差相对较大。

如何再缩小误差, 分析结果:

image-20210709205158675

蓝色的线几乎是红色向右平移,因为这个model只参考前一天的结果。 找规律, 发现有每七天一个循环,也许使用一个参考7天的model结果会更准确。修改模型

对模型的修改往往来自于对问题的理解(Domain Knowledge)

image-20210709205554126

第二个模型,将7天的数据,都列入考虑。我们得到了一个更低的Loss(0.38k)。这个模型中计算了前七天的wjxj, 每一个wb都用Gradient Descent计算,来看每一天的w*,让L减小的是w2, w4, w5为负值。

image-20210709205750727

以此类推考虑更多天...28天...56天...Loss在没有看过的资料上还是0.46k

这种将x(feature)乘上一个weight, 再加上bias得到预测结果的模型, 叫做Linear models

下一讲介绍如何将linear model做到更好。