【cs230】吴恩达Deep Learning-3/3
0. 课程计划
课程地址
2018video地址
2020slide地址
吴恩达书籍Machine Learning Yearning地址
本系列相关链接:
【cs229】吴恩达Machine Learning-1/2
【cs230】吴恩达Deep Learning-1/3
8. 高效读paper&职业规划
讲实话,从课件准备到现场演讲,吴恩达在cs230课程中的精力投入明显不如cs229,以至于我看到助教的画面有更高的专注和期待。
然而,这一节中吴恩达对于职业规划的建议高屋建瓴,相逢恨晚,窃以为是cs230整个课程中最大亮点。
8.1 T型人才–>获得工作机会
招聘者在寻找什么?
- 技能(ML 技巧, coding能力…)
- 有意义的工作经验(深入做过好项目,实践能力)
所有最强的求职者都是T型人才。具体来说:在ML、DL、PGM、NLP、CV等多个领域有基础能力,并在至少一个领域深耕。这种T型是嵌套的,例如你在下图基础上,在DL领域内的NN、BN、RNN等小领域中,也有深耕,也是T型。
基础是指:学习过课程、高质量完成了课后作业(别笑)、看过开源工程、自己做过demo;
深耕是指:深入做过好项目、开源贡献、发表论文、相关工作/实习经验;
相关是指必须是用到你所希望展现给面试官的知识,比如你找一份软件开发的工作,那么你曾经做过的硬件项目就没有意义,虽然可惜。但是避免这种可惜的方式是,谨慎换行。
血泪教训:
- 你是一个AI算法工程师,然而接受了一个交换机开发的offer.
- 你做着软件开发的工作,现在跳槽去一家做硬件指令集的公司.
- 你曾经有1/10的工作经历是做硬件算子性能优化,现在求职一份专门做硬件算子性能优化的offer.
- 你曾经有9/10的工作经验是修改pytorch内核,在求职时完全没有面试官关心这个技能点.
没错,上面这个人就是我。
其他糟糕的模式如下,有你吗?
- 只有涉猎
例如,选了几门课,按部就班上课下课,拿到不错的学分绩点,仅此而已; - 专攻
例如,一开始一头扎入某具体问题,其他领域闻所未闻; - 浅尝辄止
例如,在均有涉猎的基础上,浮光掠影、蜻蜓点水地在很多领域做了一点点没有输出成果的尝试;
8.2 选择offer
首先声明,这个理论上是对的,但是如果你和我一样是普通人(而不是小“吴恩达”),那么自身能力有限的前提下,在理论和实际之间就要另外权衡。
工作中的长期成功取决于,work with great people/projects。
具体来说:
- 关注team(10-50人)
吴恩达:最能影响你产出的是你即将参加的那个小组,而不是整个公司。
我:emm, 菊厂的经验告诉我的事,大部门优势大于个人努力。 - Manager
吴恩达:你最多接触的是你的项目经理,所以他是否称职非常重要。
我:emm,直接领导确实非常重要,这个人也许不是你的顶头上司,也许是你的顶头上司的顶头上司,总之是那个真正掌握生杀大权的人。另外,跟他是否“合拍”也很重要。 - Not ”brand”
吴恩达:强烈反对看重公司名气。举了一个反例,例如一个知名大厂,你是个AI算法工程师,招你去随机分配做java后端。举了一个正例,例如一个初创公司,在本领域名不见经传,但是有一小波非常优秀的人,吴恩达建议你加入。
我:emm,是的,我也有反例这样的经历。不过,如果你自己真得是南郭先生呢?至于这个正例,也会担心真实性、可靠性,和对风雨飘零的公司前景的担忧。
8.3 长期规划
- Learn the most
- Do important work
很多大厂在拼命做同样的一件事,试图把这件事做到极致占据技术制高点,这很好,能推导技术进步,能加入很好。
还有很多领域,称之为“传统行业”,例如制造业、医疗健康领域,现有的AI技术已经能为整个行业带来革命性进步,且当前处于变革的初步阶段。这也非常好,在有生之年,以有限的生命和智力,创造了即时回报的高价值。
9. 深度强化学习
9.1 为什么需要强化学习
Q1. 深度学习可以取代强化学习吗?为什么不能使用深度学习解决所有问题?
A1.在非常多游戏中,用相同的算法,都能训练出超出人类玩家的水平。
游戏中,你必须做长期规划,而且走法有无数种不可穷尽。
Q1.1 用深度学习如何解决?在普通深度学习方法中,首先要收集数据集,怎么设计数据集?
A1.1 例如,x是当前的棋局,y是落在每个点获胜的概率。
这样,y是很难估计的,太复杂说不清。
再例如,x是当前的棋局,y是专业选手的落子,希望机器最终能学习专业选手的测量。
Q1.2 19*19的一盘棋,有多少种状态?
A1.2
3
19
∗
19
≈
1
0
170
3^{19*19}\approx10^{170}
319∗19≈10170,这个空间超大,很难通过观察学习。而且,专业选手下的也可能是错的,或者是基于长期策略的考虑,而不是当前的最优。以及,这样学习完了,机器还是赢不了人类。
总之,这不再是模式识别的问题,而是长期策略。
9.2 RL简介
以下图的游戏为例,
Q1. 如何定义长期受益?
考虑耗时越长越差,因此使用系数
γ
≤
1
\gamma\leq 1
γ≤1。
γ
=
1
\gamma=1
γ=1,则上图中向右走得最高分,
+
0
+
1
+
10
=
11
+0+1+10=11
+0+1+10=11
γ
=
0.1
\gamma=0.1
γ=0.1,则上图中向左走得最高分,
+
2
>
+
0
+
0.1
∗
1
+
0.01
∗
10
=
0.2
+2 > +0+0.1*1+0.01*10=0.2
+2>+0+0.1∗1+0.01∗10=0.2
Q2. 我们想学什么?什么对长期受益是有利的?
每个状态下的最佳动作–Q-table,维度是#actions
×
\times
× #states;
如果学习算出了Q表,那么就知道每步确切的怎么走了。
Q3. 试着算一下Q表。
走一步的得分如上,但是每个动作的得分应该是通过该动作后游戏结束时可获得的最大得分。
例如,S3->S4的得分=1+0.910=10分,那么S2->S3的得分=0+0.910=9分,然后反复往前推。
如你所见,这种计算是迭代的:
Q4. 既然能算出来,为什么需要深度学习呢?
- 最佳Q值符合贝尔曼方程式
Bellman equation: Q ∗ ( s , a ) = r + γ max a ′ ( Q ∗ ( s ′ , a ′ ) ) Q^*(s,a)=r+\gamma\max\limits_{a'}(Q^*(s',a')) Q∗(s,a)=r+γa′max(Q∗(s′,a′))
其中 ∗ * ∗表示最佳值, r r r是 s s s状态采取a动作的即时奖励, γ \gamma γ是时间系数,后面是转到下一个状态 s ′ s' s′后直到游戏结束能获得的最大得分。 - 策略
policy: π ( s ) = arg max a ( Q ∗ ( s , a ) ) \pi(s)=\argmax\limits_a(Q^*(s,a)) π(s)=aargmax(Q∗(s,a))
function telling us what’s the best strategy to adopt.
处于状态 s s s时,应该采取什么动作 a a a。 - 状态数太多( 1 0 170 10^{170} 10170),无法存储这样的Q表
9.3 深度Q-Learning
核心思想:找到一个Q-function代替Q-table.
深度学习网路是非常优秀的函数近似器,可以作为plug-in插入到很多现有算法中。
以当前状态为输入,DL算出所有动作的得分;
Q1. 如何训练这个网络?
没有标签。
计算向左走的得分时:
L
=
(
y
−
Q
(
s
,
←
)
)
2
L=(y-Q(s,\larr))^2
L=(y−Q(s,←))2,但是y是多少。
我们不知道y,但是我们知道最佳的y应该符合贝尔曼方程:
Q
∗
(
s
,
a
)
=
r
+
γ
max
a
′
(
Q
∗
(
s
′
,
a
′
)
)
Q^*(s,a)=r+\gamma\max\limits_{a'}(Q^*(s',a'))
Q∗(s,a)=r+γa′max(Q∗(s′,a′))
所以当前我们可以猜测一个相近的y(假设当前这一步向左走更好):
y
=
r
←
+
γ
max
a
′
(
Q
(
s
←
n
e
x
t
,
a
′
)
)
y=r_{\larr}+\gamma\max\limits_{a'}(Q(s_{\larr}^{next},a'))
y=r←+γa′max(Q(s←next,a′))
我们同样不知道
Q
∗
(
s
′
,
a
′
)
Q^*(s',a')
Q∗(s′,a′),但是我们有网络初始化值,可以立即计算出所有
Q
(
s
←
n
e
x
t
,
a
′
)
Q(s_{\larr}^{next},a')
Q(s←next,a′)并找到当前看来的最佳动作;
不是最佳值
Q
∗
Q^*
Q∗,所以我们先这么用着,并期待会逐渐收敛到最佳值。
Q2. 能收敛吗?
可以,证明见论文:
[Convergence of Q-learning: a simple proof]
Q3. 网络稳定吗?
将上式代入L的计算,从而更新w时:
w
=
w
−
α
∂
L
∂
w
w=w-\alpha\frac{\partial L}{\partial w}
w=w−α∂w∂L
y的第二项对w的偏导非零,因为
Q
(
s
←
n
e
x
t
,
a
′
)
Q(s_{\larr}^{next},a')
Q(s←next,a′)依赖网络权重
w
w
w计算;
所以,y对w的偏导非零。
这样,反向传播的计算内部存在反馈回路,这导致网络不稳定。
所以,实际上训练时,Q值在很多迭代(例如10000次,直到梯度很小)中固定,然后再更新一次,再固定很多个迭代。Q值固定时,y就是一个数字,那么就可以计算损失L的偏微分了。
9.4 一个应用:Breakout
弹球游戏,目标是最快的使球穿过砖墙。
通过一段时间的强化学习后,机器自己学习到了高级技巧“打拐角”,没人告诉它!
Q1. DL网络的输入是什么?
有人说,是砖的位置、浆的位置、球的位置。这样的话,岂不是还需要将画面提取成这种特征?
no,实际上这些信息都在游戏画面中,所以输入是游戏画面。
Q2. DL网络的输出是什么?
在当前状态可以采取的所有动作的Q值。
Q3. 怎么确定小球是在上升还是下降?角度?
多用几帧,就能算出速度。
还有其他的预处理可以加快训练,例如,灰度化、裁剪图像中不影响结果的一些边缘,将预处理后的
ϕ
(
s
)
\phi(s)
ϕ(s)作为DL网络的输入。
9.5 训练技巧
9.5.1 Experience replay
数据集上看,强化学习跟经典DL学习的另一个区别是,在经典DL学习中同一个样本可能被使用很多次,但是在强化学习中当前状态也许再也碰不到了。
在强化学习中,称如下为一个体验:
E
1
ϕ
(
s
)
→
a
→
r
→
ϕ
(
s
′
)
E1~\phi(s)\rarr a\rarr r\rarr \phi(s')
E1 ϕ(s)→a→r→ϕ(s′)
E
2
ϕ
(
s
′
)
→
a
′
→
r
′
→
ϕ
(
s
′
′
)
E2~\phi(s')\rarr a'\rarr r'\rarr \phi(s'')
E2 ϕ(s′)→a′→r′→ϕ(s′′)
训练时,从所有见过的体验中抽样,因为权重变化,所以相同的状态可能会采取不同的动作,因此体验在丰富。
记忆重放的优点:
- 数据利用率高
- 否则相邻训练数据间相关太强
好比,训练猫狗分类器时不希望连续给10张猫的图像,游戏中的连续状态非常相似,应该避免连续使用 - 相当于用富足的存储和计算量,替代无穷无尽的state的搜索
9.5.2 激发新的探索
随机选一些训练不做最佳动作;
Q. 在训练中有没有人类知识对结果有区别吗?
在这个游戏中,人类看到钥匙知道有惊喜,看到梯子知道可以上下爬,看到绳子知道可以荡秋千,但是DL网络只看到无意义的像素。
论文中作者说,他们在49个类似breakout的游戏中战胜人类,但是上图这个游戏是最复杂、时间也最长的。
9.6 高级话题
树搜索
策略梯度vsQ值学习
竞争性自我学习
元学习
[Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks]
模仿学习
10. 对话助手&结课
10.1 chatbot
目标:帮助学生找到合适的课程并完成注册;
chatbot已经成为工业主题,学术界为此提供了一些帮助。
工业上,chatbot需要回答很复杂、事务性的问题,这里我们做了简化。
10.1.1 术语
- Utterance: 用户输入,直译“表述”
- Intent:用户的意图,直译“意图”
例如,enroll()注册、inform()告知 - Slot:用于从用户那汇集有关意图的信息,直译“插槽”、“萝卜坑”
例如,意图是注册,slot是“课程代码”、“学期”、“学年”、“学号”在会话系统中用户目前只提供了少量信息,