吴恩达机器学习2022学习笔记(三)
搬运课程链接: https://www.bilibili.com/video/BV1ja411S7Wq
第三部分 无监督学习,推荐系统,强化学习
-
Unsupervised Learning
- Clustering(聚类算法)
- Anomaly detection(异常检测)
-
Recommender Systems
-
Reinforcement Learning
2 聚类
2.1 什么是聚类
聚类算法着眼于数据点的数量,并自动找出彼此相关或相似的数据点。
第一个无监督学习算法:Clustering,分成许多簇(Clusters)。
应用:新闻分类,市场分类,DNA分析,天文分析
2.2 K-means算法
2.2.1 动画直观理解
①随机初始化两个簇质心
②遍历所有样本,距离哪个簇质心最近就分为哪个簇
③遍历所有的红/蓝点,然后对它们取平均值,并移动簇质心
重复②③,直到收敛
2.2.2 公式化
随机初始化K个簇质心,记为 μ_1,μ_2,...,μ_K
Repeat{
# 将点分配给簇质心,m为样本数量
for i=1 to m
c(i):=距离x(i)最近的簇质心的index(from 1 to K)
# 移动簇质心
for k=1 to K
μ_k:=属于簇k的点的平均位置
}
- 距离使用L2范数的平方,取距离最小值时的k,公式表示为:
- 当一个簇没有被分配到点的时候,最常见的做法是消除该簇
2.2.3 K-means算法的优化目标
K-means算法其实也在优化一个特定的代价函数:
- 有的文献中也叫它Distortion函数
- 代价函数只降不升,最后收敛
2.2.4 K-means算法的初始化
更常用的初始化簇质心位置的方法是:随机选择K个样本点,直接置μ1,…,μK等于这K个样本点的坐标
K-means算法的结果会因为随机初始化的位置不同而不同,因此会陷入局部最优
所以可以多次随机初始化,选择代价函数最小的那次
2.2.5 如何选择簇的数量(K)
K-means算法必须事先确定簇的数量K
因为聚类是一种无监督学习算法,没有标签没有正确答案,因此数据本身有多少簇并不明确
Elbow method:
有一种方法叫Elbow method(肘部方法),通过看K与Cost的图像拐点来确定K,就像手肘一样(下图左)
但是很多时候代价函数会很平滑,找不到拐点(下图右)
所以实践中,常常根据下游任务确定K的取值。
3 异常检测(Anomaly detection)
异常检测算法通过观察正常事件的未标记数据集,从而学会检测异常事件。
3.1 发现异常事件
举例:给定数据集:{X1, X2, …, Xm},预测X_test是否异常?
进行异常检测的最常见方法是密度估计技术(density estimation):
为X的概率建立模模型为p(X),如果p(X_test)<某个阈值ε,则发出报警,否则就认为ok。
3.2 高斯分布(正态分布)
我们需要使用高斯分布来对p(X)进行建模。
- μ是随机变量的平均值
- σ是随机变量的标准差,σ^2为方差
- μ代表曲线的中心线;σ越小,分布越集中在μ附近,σ越大,分布越分散。
但是,高斯分布的输入必须是一个数字,但实际场景中会有更多特征,所以下节我们构建可以处理多个特征的更复杂的异常检测算法。
3.3 异常检测算法
样本x有n个特征,记为[x1, x2, …, xn],假设这些特征是统计独立的,可以连乘起来:
- p(向量x) = p(x1;μ1,σ1²) * p(x2;μ2,σ2²) * … * p(xn;μn,σn²)
异常检测算法步骤:
- 选择你认为可能标示异常样本的特征xi
- 将这n个特征的参数 μ1…μn和σ1…σn在数据集上进行拟合
- 给定新样本x,计算p(x),如果p(x)<ε被认作是异常的
3.4 开发和评估异常检测系统(如何调参ε)
首先需要标注少量的已知异常样本,然后使用交叉验证法选取参数。
例如:
- Training set: 6000个正常样本(用来拟合参数μ和σ,不能包含异常样本)
- CV: 2000个正常样本,10个异常样本(用来调整阈值参数ε)
- Test: 2000个正常样本,10个异常样本
思考:既然有标注,还能叫无监督学习吗,为什么不用监督学习算法?
3.5 异常检测vs监督学习
异常检测试图找到全新的正样本,这种正样本可能不同于之前见过的任何样本;
而监督学习会观察你的正样本,并试图确定未来的样本是否与已经看到的正样本相似。
3.6 特征的选择
构建异常检测算法时,选择一个好的特征非常重要。有些不相关特征需要被忽略掉,但对于仅从未标记数据中学习的异常检测算法,它很难找出要忽略的特征。
为异常检测挑选特征的技巧:
1.使特征变得更加高斯
- 使用plt.hist查看直方图
- 运用log或者幂变换
注意:无论你对训练集使用什么转换,请记住对交叉验证和测试集也进行同样的转换。
2.寻找能具有区分性的新特征
4 推荐系统
4.1 什么是推荐系统?
例子:预测电影评分
- 行和列分别为user和item
- 为用户的数量
- 为电影的数量
- 如果用户在电影上评分了
- 为用户在电影上的评分
4.2 使用商品特征
在用户评分基础上增加商品的特征:x1,x2
对用户:用户对电影的评分预测为 ,注意有j个不同向量
然后代价函数变为
4.3 协同过滤(Collaborative Filtering)
让特征x也作为可学习的参数,学习得到某种特征
协同过滤这个名字指的是因为多个用户对同一部电影进行评分,这有点协作的样子,给了你这部电影可能样子的感觉,这可以让你猜测这部电影的合适特征,这反过来可以让你预测其他还没有评价这部电影的用户可能在未来的评价。所以这种协同过滤就是从多个用户那里收集数据,这些用户间的协作能帮助你预测未来其他用户的评分。
4.4 二值标签:收藏、点赞、点击
标签变成了:1,0,?
与逻辑回归相似
5.1 均值归一化
将值为0-5的评分标签归一化,使其具有相同均值,加快算法运行
5.2 tf实现协同过滤
TensorFlow可以自动求导,tf.GradientTape()
5.3 找到相似商品
尽管学习到的特征x不具有可解释性,但仍可以认为两个特征向量接近的商品相似,类似于embedding,在嵌入空间中欧氏距离越近的点越相似
协同过滤的缺点:
- 冷启动问题
- 如何给【很少被评分的新item】排名
- 如何给【很少评分的新user】展示合理的东西
- 无法用到商品和用户的附加有用信息
- 例如电影的类型、明星、工作室、预算等
- 例如用户的年龄、位置等
6.1 内容过滤
协同过滤 vs 内容过滤
- 协同过滤:协同过滤的方法是基于【其他和你评分相似的用户】的评分,向你推荐商品。
- 内容过滤:内容过滤会根据【用户特征】和【物品特征】,做好匹配后向你推荐。
内容过滤仍然需要获得用户对某些物品的评分数据,所以继续使用:
- ,表示用户j是否对物品i进行了评分
- ,表示用户给物品上的评分(如果有的话)
另外:
- ,表示用户j的特征
- ,表示物品i的特征
学习匹配
在内容过滤中,我们将开发一种算法用于【学习用户和物品匹配】,用户j对物品i的预测评分为:
其中, 和 分别是从 和 计算得到的,虽然 和 的维度可能相差很大,但 和 必须相同,因为它们要点积。
总而言之,在协同过滤中,我们让许多用户给不同的物品打分;而在内容过滤中,我们有用户的特征和物品的特征,我们想找到一种方法来找到用户和物品之间的良好匹配。我们要做的是计算用户向量和物品向量,然后在它们之间取点积,尝试找到好的匹配。
6.2 深度学习实现内容过滤
那么我们该如何计算和?
神经网络
我们可以将两个神经网络合并在一起训练:
6.3 从大目录中推荐
如何修改算法以扩展到非常大的物品库?物品和用户数目上百万时,每次用户都调用数千神经网络来推理,这在计算上变得不可行。
许多大规模的推荐系统的实现可以分为两个步骤:【检索】和【排名】
检索(Retrieval):
- 生成一个大list,其中包括许多看似合理的候选项目,尽可能多的涵盖所有可能(即使可能包括用户不太喜欢的),用于随后的排名步骤。例如:1)根据用户观看的最后10部电影找出10部最相似的电影,特征向量距离相近的;2)用户观看次数最多的标签,添加同类型的top10的电影;3)相同地区内,top20的电影。
- 最后,汇集检索到的所有项目并将它们合并,删除重复项、已观看的项目。最终可能找到了100部电影。
排名(Ranking):
- 使用之前训练好的神经网络对检索list进行排名
- 向用户显示推荐
6.4 符合道德的推荐系统
6.5 tf实现内容过滤
7 强化学习
7.1 什么是强化学习
案例:自动直升机、训练机器狗
强化学习的任务是找到一个函数,将状态s映射到动作a,然而监督学习的方法问题是标签y很难得到,所以使用强化学习。强化学习的关键输入是奖励函数(reward function)。
应用:
- 机器人控制
- 工厂效率优化
- 金融股票交易
- 游戏,博弈
强化学习的关键思想是,你不需要告诉它每个输入的正确输出是什么,而是指定一个奖励函数,告诉它什么时候做得好什么时候做得不好,算法就会自己想明白如何选择好的行动。
7.2 形式化强化学习
(s,a,R(a),s’)
(状态、行动、奖励、下一个状态)
7.3 强化学习中的回报(Return)
快速得到奖励or花更多时间得到更大的奖励?
Return = R1 + γ·R2 + γ²·R3 + γ³·R4 + … (直到最终状态)
折扣因子:γ=0.9
总而言之,回报是系统获得的奖励的总和,但由折扣因子加权,其中遥远未来的奖励由更高幂的折扣因子加权
7.4 强化学习中行动决策(Policies)
机器学习的目标是找到一个策略Π(s)=a,来告诉我们每一步应该采取什么动作才能使得回报最大化
7.5 复习关键概念
- states(状态)
- actions(行动)
- rewards(奖励)
- discount factor γ(折扣因子)
- return(回报)
- polocy Π(策略)
马尔可夫决策过程(Markov Decision Process, MDP):
马尔可夫是指未来仅取决于当前状态,而不取决于在到达当前状态之前可能发生的任何事情。换句话说,在马尔可夫决策过程中,未来只取决于你现在在哪里,而不取决于你是如何来到这里的。
另一种思考马尔可夫决策过程的方法是:一个agent,选择行动a,然后影响环境,agent再根据环境的状态s再选择行动…
8 状态-动作值函数(State-action value function)(Q函数)
8.1 状态-动作值函数定义
状态动作值函数是一个函数,通常由大写字母Q(s, a)表示,与状态和动作有关。Q(s, a) = 状态s下采取行动a,在此之后会获得最大的回报。
如果你能为每个状态s和每个动作a计算Q(s, a),就能得出最优策略Π(a),即a = argmaxQ(s, a)。
8.3 贝尔曼方程
如何计算Q(s, a)的值?答:贝尔曼方程。
注:贝尔曼方程(Bellman Equation)也被称作动态规划方程。
符号定义:
- s:当前状态
- a:当前动作
- s’:新状态
- a’:状态s’时采取的新动作
- R(s):当前状态的奖励
- 贝尔曼方程如下:
可以理解为当前的回报等于即时奖励+γ乘上下一个状态的回报。
8.4 随机环境(选修)
在某些场景下,agent并不总是能完全按照吩咐去做,比如向左移动可能会有10%的可能性往反方向移动。
在这种随机环境下,我们需要【期望回报】。
如果把策略试了很多很多次,取这些不同序列奖励的总和的平均值,就称之为期望回报。
所以强化学习的目标是选择策略来最大化折扣奖励总和的平均值或期望。总而言之,当你有一个随机强化学习问题或随机马尔可夫决策过程时,目标是选择一个策略,告诉我们采取什么动作a和状态s,以最大化期望回报。
由此贝尔曼方程需要修改为(多加一个期望):
9 连续状态空间
9.1 举例
状态s中的值可能不是离散的,而是连续的,即可以表示为向量。
9.2 登陆月球(案例)
action:nothing/left/main/right(什么都不做/启动左推进器/主推进器/右推进器)
state:[x, y, dx, dy, θ, dθ, l, r](坐标速度倾斜角,最后两个代表左脚和右脚是否着地)
reward:
- 成功到达着陆点:100 - 140
- 靠近正奖励,远离负奖励
- 坠毁:-100
- 软着陆:+100
- 左脚或右脚触地:+10
- 启动主推进器:-0.3
- 启动左侧或右侧推进器:-0.03
问题如下:
学习一个策略Π,给定状态s的情况下,选择行动a = Π(s),使得回报最大化。折扣因子γ=0.985。
9.3 学习Q函数
解决这个问题的关键在于要训练一个神经网络来近似Q函数(神经网络的强大拟合能力),这样就能选出好的动作。
方案:把状态s(8维)与动作a(4维, one-hot向量)拼接为12维向量作为nn的输入,输出为1个值,即Q(s, a)的预测值。计算Q(s, 所有的a),选取令Q最大的a。
如何训练这个神经网络呢?如何构建数据集?
通过采样我们可以得到许多(s, a, R(s), s’)这样的元组,s和a就是训练样本的x,训练样本的y就是贝尔曼方程。
你可能会好奇max(Q(s’, a’))该如何计算?事实上就是用上一轮迭代的nn来得到,所以初始值其实是随机的。但是随着训练Q(s, a)会预测得越来越准确。
具体算法伪代码:
- 随机初始化神经网络的所有参数
- 重复:
- 采取动作,采样得到(s, a, R(s), s’)元组
- 仅存储最新10000个样本(回放缓冲区)
- 训练神经网络:
- 构造训练集,x = (s, a),y = R(s) + γ·maxQ(s’, a’)
- 训练神经网络Qnew去近似y
- Q = Qnew
上述算法有时被成为DQN算法,代表deep、Q、network。因为你在使用深度学习来训练预测Q函数的神经网络。
9.4 改进算法1:改善神经网络结构
之前的网络结构,每次循环,每个动作a都要经过nn推理一下才能得到Q(s, a)然后选取最大值,事实上可以训练单个nn同时输出所有四个Q(s, a)值。nn结构修改如下:
9.5 改进算法2:ε-贪心策略
还在学习的时候,如何选择动作呢?
在之前的算法的【采取动作(重复步骤里的第一步)】中,策略如下:
- 假设以0.95的概率,选择使Q(s, a)最大化的动作(贪婪)
- 假设以0.05的概率,随机选择一个动作(探索)
所以大多数情况下,算法会尝试使用当前对Q(s, a)的预测来选择行动,但是在5%的情况下,会随机选择一个动作。这样做的原因是,一开始Q(s, a)是随机初始化的,一些负奖励动作可能永远不会被执行,如果偶尔尝试一下也许认为不好但实际好的动作,就能让神经网络克服自己的刻板印象,去探索(和遗传算法突变有点像)。
最后,有时的技巧是,让ε一开始很大,随后逐渐减小(1.0~0.01),所以一开始经常采取随机动作,随着时间变长,就不再太可能随机采取动作了。
缺点是:调参难。
9.6 改进算法3:小批量和软更新(选修)
mini-batch(加快训练):
梯度下降更新参数时,不遍历整个数据集,而是只使用一小部分数据集。
soft updates(更好地收敛):
最后一步Qnew直接赋给Q的时候,可能使Q发生突变,所以将nn的参数W和b,更新为旧值和新值的加权。