\qquad 好,那我们就开始上课吧,那第一堂课,是要简单跟大家介绍一下 machine learning
还有 deep learning
的基本概念。等一下会讲一个跟宝可梦完全没有关系的故事,告诉你机器学习还有深度学习的基本概念。
\qquad 好,那什么是机器学习呢?想必大家在报章杂志上其实往往都已经听过机器学习这一个词汇,那你可能也知道说机器学习就是跟今天很热门的AI
好像有那么一点关联。那所谓的机器学习到底是什么呢?顾名思义好像是说,机器他具备有学习的能力,那些科普文章往往把机器学习这个东西吹得玄之又玄,好像机器会学习以后,我们就有了人工智能,有了人工智能以后机器接下来就要统治人类了。
\qquad 那机器学习到底是什么呢?事实上,机器学习概括来说可以用一句话来描述机器学习这件事。什么叫机器学习呢?机器学习就是让机器具备找一个函式的能力,那机器具备找函式的能力以后他可以做什么样的事情呢?他确实可以做很多事,举例来说,假设你今天想要叫机器做语音识别,机器听一段声音,产生这段声音对应的文字,那你需要的就是一个函式,这个函式的输入是声音讯号,输出是这段声音讯号的内容。那你可以想象说,这个可以把声音讯号当作输入,文字当作输出的函式显然非常非常的复杂,他绝对不是你可以用人手写出来的方程式。这个函式他非常非常的复杂,人类绝对没有能力把它写出来,所以我们期待凭借着机器的力量把这个函式自动找出来,这件事情就是机器学习。那刚才举的例子是 语音识别
。还有好多好多的任务我们都需要找一个很复杂的函式。举例来说,假设我们现在要做影像辨识
,那这个影像辨识我们需要什么样的函式呢?这个函式的输入是一张图片,他的输出是什么呢?他是这个图片里面有什么样的内容。或者是大家都知道的 AlphaGo
其实也可以看作是一个函式要让机器下围棋,我们需要的就是一个函式,这个函式的输入是棋盘上黑子跟白子的位置,输出是什么?输出是机器下一步应该落子的位置。假设你可以找到一个函式,这个函式的输入就是棋盘上黑子跟白子的位置,输出就是下一步应该落子的位置。那我们就可以让机器做自动下围棋这件事,就可以做一个 AlphaGo
。
\qquad 那随着我们要找的函式不同,机器学习有不同的类别,那这边介绍几个专有名词给大家认识一下。第一个专有名词叫作 Regression
,Regression
的意思是说假设我们今天要找的函式他的输出是一个数值,他的输出是一个 scalar
,那这样子的机器学习的任务我们称之为 Regression
。那这边举一个 Regression
的例子,假设我们今天要机器做的事情是预测未来某一个时间的 PM2.5
的数值,你要叫机器做的事情是找一个函式,这个我们用 f
来表示,这个函式的输出是明天中午的 PM2.5
的数值,他的输入可能是种种跟预测 PM2.5
有关的指数,包括今天的 PM2.5
的数值、今天的平均温度、今天平均的臭氧浓度等等,这一个函式可以拿这些数值当作输入,输出明天中午的 PM2.5
的数值。那这一个找这个函式的任务叫作 Regression
。
\qquad 那还有别的任务吗?还有别的任务,除了 Regression
以外,另外一个大家耳熟能详的任务叫作 Classification
,那 Classification
这个任务要机器做的是选择题。我们人类先准备好一些选项,那这些选项又叫作类别,又叫作 classes
,我们现在要找的函式,它的输出就是从我们设定好的选项里面选择一个当作输出,那这个问题,这个任务就叫作 Classification
。举例来说,现在每个人都有 gmail account
,那 gmail account
里面有一个函式,这个函式可以帮我们侦测一封邮件是不是垃圾邮件,这个函式的输入是一封电子邮件,那他的输出是什么呢?你要先准备好你要机器选的选项,在侦测垃圾邮件这个问题里面可能的选项就是两个,是垃圾邮件或不是垃圾邮件,Yes
或者是 No
。那机器要从 Yes
跟 No
里面选一个选项出来这个问题叫作 Classification
。
\qquad 那 Classification
不一定只有两个选项,也可以有多个选项,举例来说,alpha go
本身也是一个 Classification
的问题,那只是这个 Classification
他的选项是比较多的。那如果要叫机器下围棋,你想做一个 alpha go
的话我们要给机器多少的选项呢?你就想想看,棋盘上有多少个位置?那我们知道棋盘上有 19
乘 19
个位置,那叫机器下围棋这个问题,其实就是一个有 19
乘 19
个选项的选择题,你要叫机器做的就是找一个函式,这个函式的输入是棋盘上黑子跟白子的位置,输出就是从 19
乘 19
个选项里面选出一个正确的选项,从 19
乘 19
个可以落子的位置里面选出下一步应该要落子的位置。那这个问题也是一个分类的问题。
\qquad 那其实很多教科书,在讲机器学习的种种不同类型的任务的时候,往往就讲到这边,告诉你说机器学习两大类任务,一个叫作 Regression
,一个叫作 Classification
,然后就结束了。但是假设你对机器学习的认知只停留在机器学习就是两大类任务 Regression
跟 Classification
,那就好像你以为说这个世界只有五大洲一样,你知道这个世界不是只有五大洲对不对,这个世界外面是有一个黑暗大陆的,这鬼灭之刃连载之前我们就已经出发前往黑暗大陆了,鬼灭之刃连载以后我们居然都还没有到,可见这个黑暗大陆距离那么远(这段话应该是以《鬼灭之刃》漫画调侃《全职猎人》漫画托更)。那在机器学习这个领域里面所谓的黑暗大陆是什么呢?在 Regression
跟 Classification
以外大家往往害怕碰触的问题叫作 Structured Learning
,也就是机器今天不只是要做选择题,不只是输出一个数字,还要产生一个有结构的对象。举例来说,机器画一张图,写一篇文章,这种叫机器产生有结构的东西的问题就叫作 Structured Learning
。那如果要讲得比较拟人化,比较潮一点,Structured Learning
你可以用拟人化的讲法说,我就是要叫机器学会 “创造” 这件事情。
\qquad 好那到目前为止我们就是讲了三个机器学习的任务 Regression
、Classification
跟 Structured Learning
,接下来我们要讲的是,那我们说机器学习就是要找一个函式,那机器怎么找一个函式呢?那这边要用个例子跟大家说明,说机器怎么找一个函式。这边的例子是什么呢?
\qquad 这边的例子,在讲这个例子之前,先跟大家说一下说这一门课有一个 youtube
的频道,然后这个我会把上课的录像放到这个 youtube
的频道上面,那这个频道,感谢过去修过这门课的同学不嫌弃,其实也蛮多人订阅所以我算是一个三流的 youtuber
,是没有什么太多流量,但是这边也是有 7
万多订阅。
\qquad 那为什么突然提到这个 youtube
的频道呢?因为我们等一下要举的例子跟 youtube
是有关系的。那你知道身为一个 youtuber
,youtuber
在意的东西是什么呢?youtuber
在意的就是这个频道的流量对不对?假设有一个 youtuber
是靠着 youtube
维生的,他会在意频道有没有流量,这样他才会知道他可以获利多少。所以我在想说我们有没有可能找一个函式,这个函式他的输入是 youtube
后台的信息,输出是这个频道隔天的总点阅率总共有多少。假设你自己有 youtube
频道的话,你会知道说在 youtube
后台你可以看到很多相关的信息,比如说每一天按赞的人数有多少、每一天订阅的人数有多少、每一天观看的次数有多少。我们能不能够根据一个频道过往所有的信息去预测它明天有可能的观看的次数是多少呢?我们能不能够找一个函式这个函式的输入是 youtube
上面 youtube
后台是我的信息,输出就是某一天隔天这个频道会有的总观看的次数。有可能会说,为什么要做这个,如果我有营利的话,我可以知道我未来可以赚到多少钱,但我其实没有开营利,所以我也不知道我为什么要做这个就是了,完全没有任何管用。我单纯就是想举一个例子而已,好那接下来我们就要问怎么找出这个函式呢?怎么找这个函式 F
,输入是 Youtube
后台的数据,输出是这个频道隔天的点阅的总人数呢?
\qquad 那机器学习找这个函式的过程分成三个步骤,那我们就用 Youtube
频道点阅人数预测这件事情来跟大家说明这三个步骤是怎么运作的。第一个步骤是我们要写出一个带有未知参数的函式,简单来说就是,我们先猜测一下我们打算找的这个函式 F
它的数学式到底长什么样子。举例来说,我们这边先做一个最初步的猜测:这个 F
长什么样子呢?这个输入跟 y
之间有什么样的关系呢?我们写成这个样子,y
等于 b
加 w
乘以 x 1 x_1 x1,这边的每一个数值是什么呢?这个 y
啊,就假设是今天吧,因为今天还没有过完,所以我还不知道今天总共的点阅次数是多少,所以这件事情是我们未知的,y
是我们准备要预测的东西,我们准备要预测的是今天 2
月 26
号这个频道总共观看的人数。那 x 1 x_1 x1 是什么呢? x 1 x_1 x1 是这个频道前一天总共观看的人数。y
跟 x 1 x_1 x1 都是数值,这个 y
是我们要准备预测的东西, x 1 x_1 x1 是我们已经知道的信息。那 b
跟 w
是什么呢?b
跟 w
是未知的参数,它是准备要透过数据去找出来的。我们还不知道 w
跟 b
应该是多少,我们只是隐约的猜测,但为什么会有这个猜测呢?这个猜测往往就来自于你对这个问题本质上的了解,也就是 Domain knowledge
,所以才会常常听到有人说这个做机器学习啊,就需要一些 Domain knowledge
,这个 Domain knowledge
通常是用在哪里呢?这个 Domain knowledge
就是用在写这个带有未知数的函数的时候。所以我们怎么知道说这个能够预测未来点阅次数的函式 F
,它就一定是前一天的点阅次数乘上 w
再加上 b
呢?我们其实不知道,这是一个猜测,也许我们觉得说这个今天的点阅次数总是会跟昨天的点阅次数有点关联,所以我们把昨天的点阅次数乘上一个数值,但是总是不会一模一样,所以再加上一个 b
做修正,当作是对于 2
月 26
号点阅次数的预测。这是一个猜测,它不一定是对的,我们等一下回头会再来修正这个猜测。好那现在总之我们就随便猜说 y
等于 b
加 w
乘以 x 1 x_1 x1,而 b
跟 w
是未知的。这个带有未知的参数,这个 Parameter 中文通常翻成参数,这个带有Unknown
的 Parameter
的这个 Function
我们就叫做 Model
。所以我们常常听到有人说模型 Model
这个东西,Model
这个东西在机器学习里面就是一个带有未知的Parameter
的 Function
。好那这个 x 1 x_1 x1 啊,是这个 Function
里面我们已知的,已经知道的东西,它是来自于 Youtube
后台的信息,我们已经知道 2
月 25
号点阅的总人数是多少,这个东西叫做 Feature
,而 w
跟 b
是我们不知道的,它是Unknown
的 Parameter
,那这边我们也给 w
跟 b
给他一个名字,这个跟 Feature
做相乘的未知的参数,这个 w
我们叫它 weight
,这个没有跟 Feature
相乘的是直接加下去的,这个我们叫它 Bias
,那这个只是一些名词的定义而已。等一下我们讲课的时候,我们在称呼模型里面的每一个东西的时候会更为方便,好那这个是第一个步骤。
\qquad 好那第二个步骤是什么呢?第二个步骤呢是我们要定义一个东西叫做 Loss
。什么是 Loss
呢?Loss
它也是一个 Function
,那这个 Function
它的输入是我们 Model
里面的参数。我刚才已经把我们的 Model
写出来了对不对,我们的 Model
叫做 y
等于 b
加 w
乘以 x 1 x_1 x1,而 b
跟 w
是未知的,是我们准备要找出来的。那所谓的 L
啊,所谓的这个 Loss
啊,它是一个 Function
。这个 Function
的输入是什么?这个 Function
的输入就是 b
跟 w
,所以 L
它是一个 Function
,它的输入是 Parameter
,是 model
里面的 Parameter
。那这个 Loss
,这个 Function 输出的值代表什么呢?这个 Function
输出的值代表说现在如果我们把这一组未知的参数设定某一个数值的时候,这笔数值好还是不好。
\qquad 那这样讲可能你觉得有点抽象,所以我们就举一个具体的例子,假设现在我们给未知的参数的设定是 b
这个 bias
等于 0.5k
,这个 w
呢直接等于 1
。那这个 Loss
怎么计算呢?如果我们 b
设 0.5k
,这个 w
设 1
,那我们拿来预测未来的点阅次数的函式就变成 y
等于 0.5k
加 1
倍的 x 1 x_1 x1,那这样子的一个函式,这个 0.5k
跟 1
,他们所代表的这个函式它有多好呢?这个东西就是 Loss
,那在我们的问题里面,我们要怎么计算这个 Loss
呢?这个我们就要从训练数据来进行计算,在这个问题里面,我们的训练数据是什么呢?我们的训练数据是这一个频道过去的点阅次数,举例来说,从 2017
年到 2020
年的点阅次数,每天的这个频道的点阅次数都知道,这边是假的数字啦,随便乱编的。好,那所以我们知道 2017
年 1
月 1
号到 2020
年 12
月 31
号的点阅数字是多少,接下来我们就可以计算 Loss
。怎么计算呢?我们把 2017
年 1
月 1
号的点阅次数代入这一个函式里面,我们已经说我们想要知道 b
设定为 0.5k
,w
设定为 1
的时候,这个函式有多棒。当 b
设定为 0.5k
,w
设定为 1
的时候,我们拿来预测的这个函数是 y
等于 0.5k
加一倍的 x 1 x_1 x1,那我们就把这个 x 1 x_1 x1 代 4.8k
,看它的预测出来的结果是多少。所以,根据这一个函式,根据 b
设 0.5k
,w
设 1
的这个函式,如果 1
月 1
号是 4.8k
的点阅次数的话,那隔天应该是 4.8k
乘 1
加 0.5k
,就是 5.3k
的点阅次数。那隔天实际上的点阅次数,1
月 2
号的点阅次数我们知道吗?从后台的信息里面,我们是知道的,所以我们可以比对一下现在这个函式预估的结果跟真正的结果它的差距有多大,这个函式预估的结果是 5.3k
,真正的结果是多少呢?真正的结果是 4.9k
,它是高估了,高估了这个频道可能的点阅人数。那就可以计算一下这个差距,计算一下估测的值跟真实的值的差距,这边估测的值用 y
来表示,真实的值用 ŷ
来表示,你可以计算 y
跟 ŷ
之间的差距,得到一个 e 1 e_1 e1 代表估测的值跟真实的值之间的差距。那计算差距其实不只一种方式,我这边把 y
跟 ŷ
相减直接取绝对值算出来的值是 0.4k
。好那我们今天有的数据不是只有 1
月 1
号跟 1
月 2
号的数据,我们有 2017
年 1
月 1
号到 2020
年 12
月 31
号总共三年的数据,那这个真实的值叫做 Label
,所以常常听到有人说机器学习都需要 Label
,Label
指的就是正确的数值,这个东西叫做 Label
。
\qquad 那我们不是只能用 1
月 1
号来预测 1
月 2
号的值,我们可以用 1
月 2
号的值来预测 1
月 3
号的值。如果我们现在的函式是 y
等于 0.5k
加一倍的 x 1 x_1 x1,那 1
月 2
号,根据 1
月 2
号的点阅次数预测的 1
月 3
号的点阅次数的值是多少呢?是 5.4k
,以 x 1 x_1 x1 代 4.9k
进去乘 1
在加 0.5k
等于 5.4k
。接下来计算这个 5.4k
跟真正的答案跟 Label
之间的差距,Label
是 7.5k
,看来是一个低估,低估了这个频道在 1
月 3
号的时候的点阅次数,可以算出 e 2 e_2 e2,这个 e 2 e_2 e2 是 y
跟 ŷ
之间的差距,算出来是 2.1k
,那同一个方法你就可以算过这三年来每一天的预测的误差。假设我们今天的 Function
是 y
等于 0.5k
加一倍的 x 1 x_1 x1,这三年来每一天的误差通通都可以算出来,每一天的误差都可以给我们一个小 e e e。
\qquad 好,那接下来我们就把每一天的误差通通加起来,加起来然后取得平均,这个大 N
代表我们的训验数据的个数,那我们训练数据的个数就是三年来的训练数据,就是 365
乘以 3
,每年 365
天,三年所以 365
乘以 3
。那我们算出一个 L
, 我们算出一个大 L
,这大 L
是每一笔训练数据的误差,这个 e
相加以后的结果。这个大 L
就是我们的 Loss
,这个大 L
越大代表我们现在这一组参数越不好,这个大 L
越小代表现在这一组参数越好。那这个 e
啊,就是计算这个估测的值跟实际的值之间的差距,其实有不同的计算方法,在我们刚才的例子里面我们是算 y
跟 ŷ
之间绝对值的差距,这一种计算差距的方法得到的这个大 L
,得到的 Loss
叫 mean absolute error
,缩写是 MAE
。那在这 MSE
里面,我们是算 y
跟 ŷ
相减以后的平方,如果你今天的 e
是用相减 y
平方算出来的,这个叫 mean square error
,又叫 MSE
。那 MSE
跟 MAE
他们其实有非常微妙的差别,通常你要选择用哪一种方法来衡量距离,那是看你的需求和你对这个任务的理解。那在这边呢我们就不往下讲,反正我们就是选择 MAE
作为我们计算这个误差的方式,把所有的误差加起来就得到 Loss
。那你要选择 MSE
也是可以的,在作业里面我们会用 MSE
。那有一些任务如果 y
和 ŷ
它都是机率,都是机率分布的话,在这个时候你可能会选择 Cross-entropy
,这个我们都之后再说,反正我们这边就是选择了 MAE
,那这个是机器学习的第二步。
\qquad 那我刚才举的那些数字不是真正的例子,但是在这一门课里面,我在讲课的时候就是要举真正的例子给你看,所以以下的数字是真实的例子,是这个频道真实的后台的数据所计算出来的结果。那我们可以调整不同的 w
,我们可以调整不同的 b
,穷举各种 w
, 穷取各种 b
,组合起来以后我们可以为不同的 w
跟 b
的组合都去计算它的 Loss
,然后就可以画出以下这一个等高线图。在这个等高线图上面,越偏红色系代表计算出来的 Loss
越大,就代表这一组 w
跟 b
越差;如果越偏蓝色系就代表 Loss
越小,就代表这一组 w
跟 b
越好。拿这一组 w
跟 b
放到我们的 Function
里面,放到我们的 Model
里面,那我们的预测会越精准。所以你就知道说假设 w
在负 0.25
,这个 b
在负 500
,就代表说呢,这个 W
在负 0.25
,b
在负 500
,就代表说这个频道每天看的人越来越少,而且 Loss
这么大跟真实的状况不太合;如果 w
代 0.75
,b
代 500
,那这个正确率,这个估测会比较精准。那估测最精准的地方看起来应该是在这里啦,如果你今天 w
代一个很接近 1
的值,b
带一个小小的值,比如说 100
多,那这个时候估测是最精准的。那这跟大家的预期可能是比较接近的,就是你拿前一天的点阅的总次数去预测隔天的点阅的总次数,那可能前一天跟隔天的点阅的总次数其实是差不多的,所以 w
设 1
,然后 b
设一个小一点的数值,也许你的估测就会蛮精准的。那像这样子的一个等高线图,就是你试着试了不同的参数,然后计算它的 Loss
画出来的这个等高线图叫做 Error Surface
,那这个是机器学习的第二步。
\qquad 接下来我们进入机器学习的第三步,那第三步要做的事情,其实是解一个优化的问题。如果你不知道优化的问题是什么的话也没有关系,我们今天要做的事情就是找一个 w
跟 b
,把未知的参数找一个数值出来,看代那一个数值进去可以让我们的大 L
,让我们的 Loss
的值最小,那个就是我们要找的 w
跟 b
。那这个可以让 loss
最小的 w
跟 b
,我们就叫做 w*
跟 b*
,代表说他们是最好的一组 w
跟 b
,可以让 loss
的值最小。那这个东西要怎么做呢?在这一门课里面,我们唯一会用到的 Optimization
的方法叫做 Gradient Descent
。
\qquad 那这个 Gradient Descent
这个方法要怎么做呢?它是这样做的,为了要简化起见,我们先假设我们未知的参数只有一个就是 w
,我们先假设没有 b
那个未知的参数,只有 w
这个未知的参数。那当我们 w
代不同的数值的时候,我们就会得到不同的 Loss
,这一条曲线就是 error surface
,只是刚才在前一个例子里面我们看到的 error surface
是二维的,是 2D
的,那这边只有一个参数,所以我们看到的这个 error surface
是 1D
的。
\qquad 那怎么样找一个 w
去让这个 loss
的值最小呢?那首先你要随机选取一个初始的点,那这个初始的点我们叫做 w 0 \pmb{w^0} w0w0w0,那这个初始的点往往真的就是随机的,就是随便选一个,真的都是随机的。那在往后的课程里面我们其实会看到也许有一些方法可以给我们一个比较好的 w 0 \pmb{w^0} w0w0w0 的值,那我们先不讲这件事,我们先当作都是随机的,随便掷个骰子随机决定 w 0 \pmb{w^0} w0w0w0 的值应该是多少。那假设我们随机决定的结果是在这个地方,那接下来你就要计算说在 w
等于 w 0 \pmb{w^0} w0w0w0 的时候,w
这个参数对 loss
的微分是多少?那我假设你知道微分是什么,这对你来说不是个问题,计算 w
对 loss
的微分是多少。如果你不知道微分是什么的话,那没有关系,反正我们做的事情就是计算在这一个点,在 w 0 \pmb{w^0} w0w0w0 这个位置的这个 error surface
的切线斜率,也就是这一条蓝色的虚线它的斜率。那如果这一条虚线的斜率是负的,那代表什么意思呢?代表说左边比较高右边比较低,在这个位置附近左边比较高右边比较低。那如果左边比较高右边比较低的话,那我们要做什么样的事情呢?如果左边比较高右边比较低的话,我们就把 w
的值变大那我们就可以让 loss
变小。如果算出来的斜率是正的,就代表说左边比较低右边比较高,是这个样子的,左边比较低右边比较高。如果左边比较低右边比较高的话,那就代表我们把 w
变小了,w
往左边移,我们可以让 Loss
的值变小,那这个时候你就应该把 w
的值变小。那假设你连斜率是什么都不知道的话也没有关系,你就想象说有一个人站在这个地方,然后他左右环视一下,那这一个算微分这件事啊就是左右环视,它会知道左边比较高还是右边比较高,看哪边比较低它就往比较低的地方跨出一步。
\qquad 那这一步要跨多大呢?这一步的步伐的大小取决于两件事情,第一件事情是这个地方的斜率有多大,这个地方的斜率大,这个步伐就跨大一点;斜率小步伐就跨小一点。另外,除了斜率以外,就是除了微分这一项(微分这一项我们刚才说它就代表斜率),除了微分这一项以外还有另外一个东西会影响步伐大小,这个东西我们这边用 η \pmb{\eta} ηηη来表示,这个 η \pmb{\eta} ηηη 叫做 learning rate
,叫做学习速率。这个 learning rate
它是怎么来的呢?它是你自己设定的,你自己决定这个 η \pmb{\eta} ηηη 的大小,如果 η \pmb{\eta} ηηη 设大一点,那你每次参数 update
就会量大,你的学习可能就比较快;如果 η \pmb{\eta} ηηη 设小一点,那你参数的 update
就很慢,每次只会改变一点点参数的数值。那这种你在做机器学习需要自己设定的东西叫做 hyperparameters
。这个我们刚刚讲说机器学习的第一步就是订一个有未知参数的 function
,而这些参数这些未知的参数是机器自己找出来的。
\qquad 请说好,那你请说。(此处有人提问)好,这其实是一个好的问题,我复述一下这个问题,有同学问说为什么 Loss
可以是负的呢?Loss
这个函数是自己定义的,所以在刚才我们的定义里面,我们说 Loss
就是估测的值跟正确的值它的绝对值。那如果根据刚才 Loss
的定义,那它不可能是负的,但是 Loss 的这一个 function
是你自己决定的,你可以说我今天要决定一个 loss function
就是绝对值再减100
,那你可能就有负的。所以我这边这一个 curve
,我这边可能刚才忘了跟大家说明说这个 curve
并不是一个真实的 Loss
,它是我随便乱举的一个例子。因为在今天我想要举一个比较 general
的 case
,它并不是一个真实任务的 Error surface
。所以这个 Loss
的这个 curve
,这个 error surface
它可以是任何形状,这边没有预设立场说它一定要是什么形状。但是确实在真实在刚才这一个如果 Loss
的定义就跟我刚才定的一样是绝对值,那它就不可能是负值,但这个 Loss
这个 function
是你自己决定的所以它有可能是负的。好既然有同学在这边问问题我们就在这边停一下看大家有没有问题想问的,然后助教以后会帮我看 Youtube
的直播,有人在直播上问问题吗?如果有的话你就帮我念一下,你先看好以后在念给我听,我们就先继续讲,我们讲到一个段落再来要继续回答大家的问题。再问一下现场同学有没有同学想要问问题的?好没有的话就请容我继续讲。
\qquad 好那刚才讲到那里呢?刚才讲到 hyperparameter
这个东西,hyperparameter
是你自己设的,所以在机器学习的这整个过程中,你需要自己设定的这个东西就叫做 hyperparameter
。那我们说我们要把 w 0 \pmb{w^0} w0w0w0 往右移一步,那这个新的位置就叫做 w 1 \pmb{w^1} w1w1w1,这一步的步伐是 η \pmb{\eta} ηηη 乘上微分的结果,那如果你要用数学式来表示它的话就是把 w 0 \pmb{w^0} w0w0w0 减掉 η \pmb{\eta} ηηη 乘上微分的结果得到 w 1 \pmb{w^1} w1w1w1。
\qquad 那接下来你就是反复进行刚才的操作,你就计算一下 w 1 \pmb{w^1} w1w1w1 这个微分的结果,然后再决定现在要把 w 1 \pmb{w^1} w1w1w1 移动多少,然后再移动到 w 2 \pmb{w^2} w2w2w2,然后你再继续反复做同样的操作不断的把 w \pmb{w} www 移动位置,最后你会停下来,什么时候会停下来呢?往往有两种状况,第一种状况是你失去耐心了,你一开始会设定说我今天在调整我的参数的时候,我在计算我的微分的时候,我最多计算几次,你可能会设说我的上限就是设定 100
万次,就我参数更新 100
万次以后我就不再更新了。那至于要更新几次,这个也是一个 hyperparameter
,这个是你自己决定的,如果说 deadline
是明天,那你可能更新的次数就设少一点,如果 deadline
是下周,更新的次数就设多一点。那还有另外一种理想上的停下来的可能,是今天当我们不断调整参数调整到一个地方它的微分的值就是这一项算出来正好是 0
的时候,如果这一项正好算出来是 0
,0
乘上 learning rate
—— η \pmb{\eta} ηηη 还是 0
。所以你的参数就不会再移动位置,那假设我们是这个理想的状况,我们把 w 0 \pmb{w^0} w0w0w0 更新到 w 1 \pmb{w^1} w1w1w1 再更新到 w 2 \pmb{w^2} w2w2w2,最后更新到 w T \pmb{w^T} wTwTwT。 w T \pmb{w^T} wTwTwT 卡住了也就是算出来这个微分的值是 0
了,那参数的位置就不会再更新。
\qquad 那讲到这边你可能会马上发现说 Gradient Descent
这个方法有一个巨大的问题,这个巨大的问题在这一个例子里面非常容易被看出来,就是我们没有找到真正最好的解,我们没有找到那个可以让 Loss
最小的那个 w
。在这个例子里面把 w
设定在这个地方(最右边红色点)你可以让 Loss
最小,但是如果 Gradient Descent
是从这个地方(小人所在位置)当作随机初始的位置的话,也很有可能走到这里( w T w^T wT)你的训练就停住了,你就没有办法再移动 w
的位置。那这一个位置(最右边红色点)这个真的可以让 Loss
最小的地方叫做 global
的 minima
,而这个地方( w T w^T wT)叫做 local
的 minima
,它的左右两边都比这个地方的 loss
还要高一点,但是它不是整个 error surface
上面的最低点,这个东西叫做 local minima
。所以常常可能会听到有人讲到 Gradient Descent
就会说 Gradient Descent
不是个好方法,这个方法会有 local minima
的问题,没有办法真的找到 global minima
,但教科书常常这样讲,农场文常常这样讲。但这个其实只是幻觉而已,事实上假设你有做过深度学习相关的事情,假设你有自己训练 network
,自己做过 Gradient Descent
经验的话,其实 local minima
是一个假问题,我们在做 Gradient Descent
的时候真正面对的难题不是 local minima
,到底是什么这个,我们之后会再讲到,在这边你就先接受先相信多数人的讲法说 Gradient Descent
有 local minima
的问题。在这个图上在这个例子里面显然有 local minima
的问题,但之后会再告诉你说 Gradient Descent
真正的痛点到底是什么。
\qquad 那刚才举的是只有一个参数的例子而已,那我们实际上刚才的模型有两个参数,有 w
跟 b
,那有两个参数的情况下怎么用 Gradient Descent
呢?其实跟刚才一个参数没有什么不同,若一个参数你没有问题的话,你可以很快的推广到两个参数。我们现在有两个参数,那我们给它两个参数都给它随机的初始的值就是 w 0 \pmb{w^0} w0w0w0 跟 b 0 \pmb{b^0} b0b0b0。然后接下来呢,你要计算 w \pmb{w} www 跟 Loss
的微分,你要计算 b \pmb{b} bbb 对 Loss
的微分。计算是在 w \pmb{w} www 等于 w 0 \pmb{w^0} w0w0w0 的位置, b \pmb{b} bbb 等于 b 0 \pmb{b^0} b0b0b0 的位置,在 w \pmb{w} www 等于 w 0 \pmb{w^0} w0w0w0 的位置, b \pmb{b} bbb 等于 b 0 \pmb{b^0} b0b0b0 的位置,你要计算 w \pmb{w} www 对 L \pmb{L} LLL 的微分,计算 b 0 \pmb{b^0} b0b0b0 对 L \pmb{L} LLL 的微分。计算完以后就根据我们刚才一个参数的时候的做法去更新 w \pmb{w} www 跟 b \pmb{b} bbb,把 w 0 \pmb{w^0} w0w0w0 减掉 learning rate
乘上微分的结果得到 w 1 \pmb{w^1} w1w1w1,把 b 0 \pmb{b^0} b0b0b0 减掉 learning rate
乘上微分的结果得到 b 1 \pmb{b^1} b1b1b1。
\qquad 那有同学可能会问说这个微分这个要怎么算啊?如果你不会算微分的话不用紧张,怎么不用紧张呢?在 deep learning
的 framework
里面,或在我们作业一会用的 pytorch
里面,算微分都是程序自动帮你算的,你就写一行程序自动就把微分的值就算出来了,你就算完全不知道自己在干嘛也还是可以把微分的值算出来。所以这边如果你根本就不知道微分是什么,不用担心,这一步骤就是一行程序。这个等一下之后在作业一的时候大家可以自己体验看看,那就是反复同样的步骤就不断的更新 w \pmb{w} www 跟 b \pmb{b} bbb,然后期待最后你可以找到一个最好的 w \pmb{w} www、 w ∗ \pmb{w^*} w∗w∗w∗ 跟最好的 b \pmb{b} bbb、 b ∗ \pmb{b^*} b∗b∗b∗。
\qquad 那这边呢就是举一下例子跟大家看一下说,如果在这一个问题上它操作起来是什么样子?假设你随便选一个初始的值在这个地方(图中最左侧黄点),那你就先计算一下 w \pmb{w} www 对 L
的微分跟计算一下 b \pmb{b} bbb 对 L
的微分。然后接下来你就要更新 w \pmb{w} www 跟 b \pmb{b} bbb,更新的方向就是 w \pmb{w} www 对 L
的微分乘以 η \pmb{\eta} ηηη 再乘以一个负号, b \pmb{b} bbb 对 L
的微分乘以 η \pmb{\eta} ηηη 再乘以一个负号。算出这个微分的值你就可以决定更新的方向,你就可以决定 w \pmb{w} www 要怎么更新, b \pmb{b} bbb 要怎么更新。那把 w \pmb{w} www 跟 b \pmb{b} bbb 更新的方向结合起来就是一个向量,就是这个红色的箭头,我们就从这个位置(左数第一个黄点)移到这个位置(左数第二个黄点)。然后再计算一次微分 ,然后你再决定要走什么样的方向,把这个微分的值乘上 learning rate
再乘上负号,你就知道红色的箭头要指向那里,你就知道怎么移动 w \pmb{w} www 跟 b \pmb{b} bbb 的位置,一直移动一直移动一直移动,期待最后可以找出一组不错的 w \pmb{w} www 跟 b \pmb{b} bbb。那实际上真的用 Gradient Descent
进行一番计算以后,这个是真正的数据,我们算出来的最好的 w \pmb{w} www 是 0.97
,最好的 b \pmb{b} bbb 是 0.1k
,跟我们的猜测蛮接近的,因为 x 1 \pmb{x_1} x1x1x1 的值可能跟 y \pmb{y} yyy 很接近,所以这个 w \pmb{w} www 就设一个接近 1
的值, b \pmb{b} bbb 就设一个比较偏小的值。那 Loss
多大呢?Loss
算一下是 0.48k
,也就是在 2017
到 2020
年的数据上如果使用这一个函式, b \pmb{b} bbb 代 0.1k
, w \pmb{w} www 代 0.97
,那平均的误差是 0.48k
,也就是它的预测的观看人数误差大概是 500
人次左右。
\qquad 讲到目前为止,我们就讲了机器学习的三个步骤。第一个步骤写出一个函式,这个函式里面是有未知数的;第二个步骤,定义一个叫做 Loss
的 function
;第三个步骤解一个 Optimization
的 problem
,找到一组 w \pmb{w} www 跟 b \pmb{b} bbb 让 Loss
最小。那 w \pmb{w} www 跟 b \pmb{b} bbb 的值刚才已经找出来的,那这组 w \pmb{w} www 跟 b \pmb{b} bbb 可以让 Loss
小到 0.48k
,但是这样是一个让人满意或值得称道的结果吗?也许不是,为什么?因为这三个步骤合起来啊叫做训练,我们现在是在我们已经知道答案的数据上去计算 Loss
,2017
到 2020
年的数据我们已经知道啦,我们其实已经知道 2017
到 2020
年每天的观看次数,所以其实我们现在其实只是在自 high
而已,就是假装我们不知道隔天的观看次数然后拿这一个函式来进行预测,发现误差是 0.48k
。但是我们真正要在意的是已经知道的观看次数吗?不是,我们真正要在意的是我们不知道的未来的观看的次数是多少,所以我们接下来要做的事情是什么呢?就是拿这个函式来真的预测一下未来的观看次数,那这边我们只有 2017
年到 2020
年的值,我们在 2020
年的最后一天跨年夜的时候找出了这个函式。接下来从 2021
年开始每一天我们都拿这个函式去预测隔天的观看人次,我们就拿 2020
年的 12
月 31
号的观看人次去预测 2021
年元旦的观看人次,用 2021
年元旦的观看人次预测一下 2021
年元旦隔天 1
月 2
号的观看人次,用 1
月 2
号的观看人次去预测 1
月 3
号的观看人次,每天都做这件事,一直做到 2
月 14
号,就做到情人节。然后得到平均的值,平均的误差值是多少呢?这个是真实的数据的结果,在 2021
年没有看过的数据上这个误差值是我们这边用 L'
来表示,它是 0.58
,所以在有看过的数据上,在训练数据上误差值是比较小的,在没有看过的资料上,在 2021
年的数据上看起来误差值是比较大的。那我们每一天的平均误差有 580
人左右,600
人左右。
\qquad 只是能不能够做得更好呢?在做得更好之前我们先来分析一下结果,这个图怎么看呢?这个图的横轴是代表的是时间,所以 0
这个点,最左边的点代表的是 2021
年 1
月 1
号,最右边点代表的是 2021
年 2
月 14
号,然后这个纵轴啊就是观看的人次,这边是用千人当作单位。红色的线是什么呢?红色的线是真实的观看人次,蓝色的线是机器用这一个函式预测出来的观看人次,你有发现很明显的,这个蓝色的线没什么神奇的地方,它几乎就是红色的线往右平移一天而已。它其实也没做什么特别厉害的预测,就把红色的线往右平移一天,因为这很合理,因为我们觉得 x 1 \pmb{x_1} x1x1x1,也就是前一天的观看人次跟隔天观看人次的,要怎么拿前一天的观看人次去预测隔天的观看人次呢?前一天观看人次乘以 0.97
加上 0.1k
,加上 100
就是隔天的观看人次。所以你会发现说机器几乎就是拿前一天的观看人次来预测隔天的观看人次,但是如果你仔细观察这个图你就会发现,这个真实的资料有一个很神奇的现象,它是有周期性的,它有神奇的周期性,你知道这个周期是什么吗?你知道它每隔七天就会有两天特别低,两天观看的人特别少,那两天是什么日子呢?那我发现那两天都固定是礼拜五跟礼拜六,礼拜五跟礼拜六我可以了解,就礼拜五周末,大家出去玩谁还要学机器学习,礼拜六谁还要学机器学习,那不知道为什么礼拜天大家去学机器学习?这个我还没有参透为什么是这个样子,也许跟 youtube
背后神奇的算法有关系,比如说 youtube
都会推频道的影片,也许 youtube
在推频道的影片的时候它都选择礼拜五礼拜六不推,只推礼拜天到礼拜四,可是为什么推礼拜天到礼拜四呢?这个我也不了解,但是反正看出来的结果,我们看真实的数据就是这个样子,每隔七天一个循环,每个礼拜五礼拜六看的人就是特别少。所以既然我们已经知道每隔七天就是一个循环,那这一个式子,这一个 model
显然很烂,因为它只能够看前一天。如果说每隔七天它一个循环,我们应该要看七天对不对?如果我们一个模型它是参考前七天的数据,把七天前的数据直接复制到拿来当作预测的结果,也许预测的会更准也说不定。
\qquad 所以我们就要修改一下我们的模型。通常一个模型的修改往往来自于你对这个问题的理解,也就是 Domain Knowledge
,所以一开始我们对问题完全不理解的时候我们就胡乱写一个 y
等于 b
加 w x 1 \pmb{wx_1} wx1wx1wx1 并没有做得特别好。接下来我们观察了真实的数据以后得到一个结论是每隔七天有一个循环,所以我们应该要把前七天的观看人次都列入考虑,所以我们写了一个新的模型,这个模型长什么样子呢?这个模型就是 y
等于 b
加 x j \pmb{x_j} xjxjxj, x j \pmb{x_j} xjxjxj 代表什么?这个下标 j
代表是几天前,然后这个 j
等于 1
到 7
,也就是从一天前、两天前、一直考虑到七天前,那七天前的资料通通乘上不同的 weight
,乘上不同的 w j \pmb{w_j} wjwjwj 加起来,再加上 bias
得到预测的结果。如果这个是我们的 model
,那我们得到的结果是怎么样呢?我们在训练数据上的 Loss
是 0.38k
,那因为这边只考虑一天,这边考虑七天,所以在训练数据上你会得到比较低的 Loss
。这边考虑了比较多的信息,在训练数据上你应该要得到更好的更低的 Loss
,这边算出来是 0.38k
。但它在没有看过的数据上面做不做得好呢?在没有看到的数据上有比较好是 0.49k
,所以刚才只考虑一天是 0.58k
的误差,考虑七天是 0.49k
的误差,那这边每一个 w
跟 b
我们都会用 Gradient Descent
算出它的最佳值。它的最佳值长什么样子呢?这边 show
出来给你看,它的最佳值长这样,当然机器的逻辑我是有点没有办法了解,我本来以为它会选七天前的数据,七天前的观看人数直接复制过来,我看来它没有这样选就是了。它的逻辑是前一天跟你要预测的隔天的数值的关系很大,所以 w 1 ∗ \pmb{w^*_1} w1∗w1∗w1∗ 是 0.79
,那不知道为什么它还考虑前三天,前三天是 0.12
,然后前六天是 0.3
,前七天是 0.18
。不过它知道说如果是前两天前四天前五天它的值会跟未来我们要预测的隔天的值是成反比的,所以 w 2 ∗ \pmb{w^*_2} w2∗w2∗w2∗、 w 4 ∗ \pmb{w^*_4} w4∗w4∗w4∗ 跟 w 5 ∗ \pmb{w^*_5} w5∗w5∗w5∗ 它们最佳的值(让 Loss
可以在训练数据上是 0.38k
的值)是负的,但是 w 1 ∗ \pmb{w^*_1} w1∗w1∗w1∗、 w 3 ∗ \pmb{w^*_3} w3∗w3∗w3∗、 w 6 ∗ \pmb{w^*_6} w6∗w6∗w6∗ 跟 w 7 ∗ \pmb{w^*_7} w7∗w7∗w7∗ 是正的。我们考虑前 7
天的值,那你可能会问说能不能够考虑更多天呢?可以,那这个轻易的改考虑更多天,本来是考虑前 7
天然后考虑 28
天会怎么样呢?28
天就一个月,考虑前一个月每一天的观看人次去预测隔天的观看人次,预测出来结果怎样呢?训练资料上是 0.33k
,那在 2021
年的资料上,在没有看过的数据上是 0.46k
,看起来又更好一点。好 28
天,好那接下来考虑 56
天会怎么样呢?在训练资料上是稍微再好一点是 0.32k
,在没看过的数据上还是 0.46k
,看起来考虑更多天没有办法再更进步了,看来考虑天数这件事也许已经到了一个极限。好那这边这些模型它们都是把输入的这个 x \pmb{x} xxx,这个 x \pmb{x} xxx 还记得它叫什么吗?它叫做 feature
,把 feature
乘上一个 weight
再加上一个 bias
就得到预测的结果这样的模型有一个共同的名字叫做 Linear model
,那我们接下来会看怎么把 Linear model
做得更好。