文章目录
- Week1
- Unsupervised Learning
- Clustering
- K-means
- principle
- Optimization objective
- Initializing K-means
- chose the number of clusters
- Anomaly Detection
- Find unusual events
- Algorithm
- chose epsilon
- Anomally Detection vs Supervised learning
- features
- Week2
- Recommender System
- Collaborative filtering algorithm
- Binary labels
- Recommender Systems implementation
- Mean normalization
- tensorflow implementation
- Find related items
- Limitations of Collaborative Filtering
- Content-based Filtering
- Content-based filtering algorithm
- Recommending from a large catalogue
- Principal Component Analysis(现在用处很少)
- Week3
- Reinforcement Learning
- batch and soft-update
本系列参考视频:吴恩达的machine-learing 可去coursera官网查看
链接
然后就是比较偏向的是个人笔记,具体就是个人的理解能力以及复盘能力有所差异,这边仅当做个参考,做个笔记式的学习。
这边有看到有别的up进行搬运,这边就也一并粘贴出来:
链接
Week1
Unsupervised Learning
无监督学习现在主流的就分为下面的几类:
- 聚类问题
- 异常检测
- 推荐系统
- 强化学习
而这一些,后面也会慢慢的进行介绍。
Clustering
在监督学习的分类当中,我们我存在明确的y标签用于分类,如最上面的图,而在无监督学习当中,我们所选取的是没有标签的数据,让机器自己去分门别类出这些数据,自己去聚类。
K-means
principle
首先讲一下K-means的工作原理:
- 先随机选点作为分类的簇中心
- 根据距离长远,进行分类。
- 算这一类的均值,得到新的聚类中心:
之后不断循环,直到某个指标(后面会谈)达到,也就是分好类,也可以说是收敛。
但是在这个流程中其实有一个问题就是,我们在分类的时候,有可能让其中一个类的数量(点)为0,这是可能出现的,在这种情况下,我们一般采取的措施都是直接去掉这个簇,或者还有一种方式是重新重置随机这个点。
Optimization objective
在无监督学习当中,我们按照机器学习的角度进行分析,此时实际上还是可以看到他也是拥有cost-function,也可以当成是loss,相同的,我们的目的就是让这个loss变小,然后在机器学习当中我们是通过loss反向计算梯度,来让相关的参数进行下降,而在k-means当中我们是通过得到分簇之后,然后通过求平均位置来让其下降,然后不断迭代循环,那么有人就问了,那这个损失函数有什么用呢,hh,评估用的,有时候并不需要使用损失函数来对参数进行反解。
还有上文的图中值得关注的就是k和m的值是不一致的,自己想一下为什么,之前解释过。
然后现在就需要进行解释为什么我们采用平均值的方法可以导致这个损失函数最终收敛,这个给出证明图吧,个人觉得很简单,就不去证明了。
单拿一个维度为例子:
Initializing K-means
对于原始簇中心的点的初始化的位置,往往会影响数据生成的效果:
前提:K < m (K就是想要分成的类,不一定是真实分成的类,C代表的就是对应的类,M就是点的总数)
在上图当中我们是可以看出来,在很大的情况下,随着我们的初始化的点的位置不一样,最后的效果实际上也是不一样的(实际上就是陷入了local minimal),拿如何去抉择一个好的分类呢?
当然此时就需要用到损失函数了。我们通过损失来判断这个方法得到的分类的效果到底好不好。
chose the number of clusters
我们上面介绍过分类出来的类别的总数是不固定的,或者也可以说我们在选择分成的类数也是不固定的,那么该怎么判断这个超参数的好坏呢?
一个方法是使用肘法:(不推荐)
寻找一个梯度变化最慢的位置,但有时候我们会发现实际上没有这么一个点,他的变化都很平缓,还有就是这种方法没有下面的方法好。
第二种就是,通过实际的检验,或者成本分析之类的方法进行调整:
例如这个T-shirt的例子:
我们分成多少类,实际上取决于这个成本以及购买的分析,属于一个不在机器学习考虑的问题上,或者就是说没有提供给机器学习来考虑这个问题的信息。
Anomaly Detection
Find unusual events
异常检测也是最近一个比较火的热门领域,这边先稍微介绍一下:
就如上面的探究中,我们收集相关特征,并给出相关的数据集,然后拿一个需要预测的新的x输入,判断这个是否存在异常,这就是使用的过程。
具体的流程所采用的就是拿一个阈值概率来进行判断,我们拿新的点放入之后,查看他位于多少比率的位置上,然后我们选定那个阈值概率,当在外面的时候就需要进行检测,当在内部的时候就是正常的点。
Algorithm
首先就是我们默认数据的分布都满足高斯分布,(就算不满足的话,后面也会有方法进行处理),先当作满足高斯分布。
然后就是我们采用的概率预测是:
认为特征之间满足独立性(即使不满足也没关系,实际上求取的都是一个正相关的关系),然后真实的概率,就等于按照x1的高斯概率,和x2的高斯概率,所有起来相乘,这边再次解释一下f(x;m,n)这种公式的意思,在分号前是需要给进去的输出,m和n是根据x之后算出的值,也就是需要多算一步的,并不是需要给入的值,然后f根据这些参数进行运算。
然后给一个比较完整的流程:
然后这时候我们就会发现那个阈值不知道该怎么进行选择,选择不同,当然最后得到的效果也就会不同。
chose epsilon
实际上在这个选择当中,我们采用的方法是类似与监督学习的方式进行,后面会解释他和传统监督学习的差别。
我们还是需要一些带有标签的数据,比如这里,我们常用的就是我们会需要两个数据集:
- 第一个数据集train:内部放上全是非异常的样例,我们一般把非异常的样例的y-label当作0.
- 第二个数据集valid:内部放上很大一部分非异常的数据集,记住一定数量一定要大,然后再放上部分异常的数据,并进行标记y-label为1,最后在这个异常检测当中,我们手动调整epsilon,最好能让这20个全都显示异常。
并且此时我们的调整,实际上可以使用上,之前讲解的混淆矩阵:
个人感觉重点关注Recall,Recall需要100%,需要这么调整。
Anomally Detection vs Supervised learning
这边稍微讲解一下适用场景吧:
- 对于监督学习来说,监督学习适合于根据自己以往给出的数据集进行推理,他在特征已经出现了进行训练的地方进行训练,往往可以得到好的效果,就比如判断是不是猫,就基本那几种类型,比较不会出现新的特征。
- 对于异常检测,他适合于一些时常会有新的特征出现的场景,不仅仅是他训练起来方便,而且他也更适合于判断这种类型(实践证明),比如说欺诈,隔一段时间就会出现新的欺诈方式,如果仅仅使用监督学习来说,效果是不太好的,原因就是监督学习比较倾向于学习那些已经出现过的。
features
由于上文我们讲解过我们使用的特征默认其满足高斯分布,但有时候确实部分不满足,这就需要我们进行手动调整(别直接使用layernormalization,这是会改变分布的):
我们采用的方法是先绘制出来x的分布直方图,然后通过数学函数调整,调整满足之后,我们在检测的时候也需要对对应的特征进行一样的处理。
而处理的方式一般有2中:
- log(x+c) 方法,我们可以调整c的值,来让x更满足高斯分布。
- x^(小于1的数) 方法,这也是一种方法。
还有就是关于特征的增加方面:
我们不仅可以传入新的信息,更可以加上:
相关的判断式子,这些取决于我们对于业务的理解。
Week2
Recommender System
先给出,一般来说我们所知道的数据集:
一般存在两种情况,这是其一,先按照这种进行讲解,就是按照用户给对应的产品的评分作为实际的评分,记为r(i,j)。
然后介绍一下这张表中的内容,我们用用户对于这一个电影的评分作为r,然后?就是这个用户并没有看过这个内容,所以并没有对于这个内容进行评分。
然后下面先假设我们知道每一个movie对应的属性,x,因为r实际上是需要我们进行预测的,我们需要x进行预测,先假设x,是我们所知道的,后面再介绍x会怎么求出:
我们假设这个表中存在已知两个特征:x1,x2,然后现在我们的目的就是给出?的那些的评分,从而给出相关的判断,判断他是不是可能喜欢这部电影,如果喜欢就给出相关的推荐。
然后我们采用的预测也比较简单,就是之前最常用的线性预测,不过需要注意的是w和b都是矩阵,然后这边采用的是dot-product,一般也可以转化为multiplication。
然后解释一下参数,在这个图当中,我们可以发现每一个仅仅只需要两个参数w和b,以及这个电影的特征x即可算出最后的个人的推荐评分,一个人对应的就只有一列w和b,这是需要关注的。
而cost function自然也简单:
由于我们预测出来的数字并没有要求他是满足分类的效果的,所以采用的可以是均方误差作为loss,所以就有上图。
至此大概就是我们常见的一个分析流程
Collaborative filtering algorithm
协同过滤算法:
在很多情况下对于x标签我们是并不知道的,这个也是需要我们进行训练的出的。
此时我们会发现,就需要通过知道w和b 然后进行反推x的值。
于是就有:
但此时会发现陷入了一个小的循环,我们想要知道x就需要知道w和b,想要知道w和b就需要知道x,于是产生了协同过滤这种算法:
准确来说就是我们就是给x,w,b都假设一个初始值,然后一起放入运算,只知道最后预测出来的y,通过y和最终的偏差,然后对于这三个参数都进行梯度下降:
所以这也是一种无监督学习,在之前我们讲解的无监督学习中,我们都是只知道x,但是并不知道y的值,让其根据一定的算法进行分类预测,而这边的推荐算法,则相反我们知道y,然后让其自动猜测出x,以及那些参数,这就是和正常的算法不同之处。
Binary labels
当数据更倾向于这种,分类型的,比如说只有两种情况,前者是点赞,后者是不点赞,?是没有看过。
而我们的操作也很简单,就是从线性模型转化为逻辑回归。
相同的cost function,也一致,替换成分类问题的即可:
Recommender Systems implementation
Mean normalization
这项技术主要用于那些?类型的数据,当这些电影已经被很多人看到过了,然后此时新增了一个用户,这个用户的品味(w和b,我们都不知道,一般是直接初始化为对应矩阵形状大小的0),但是对于其的label呢? 注意这里并不是x,x并不需要进行初始化,x的值取决于movie本身,所以x的值在之前就已经训练好了,那我们的movie全部由新生成的w和对应的x进行相乘的话,实际上也可以,但对于算法的计算并不是一个好的方法,我们一般采用的方法就是采用均值替代,也就是第二张图的方法:
tensorflow implementation
经典的Auto Diff 思想(也可以叫做Auto Grad思想一样的)
Find related items
由于我们的x的解释性很差,因为这些特征都是他根据梯度计算出来的,并不是我们提前设定的,所以我们往往并不知道这些x的具体的含义是什么:
我们这边采用的做法就是,对于这个分类选定一个最为确定的电影,或者几组,然后我们是知道这个对应的电影他的x的值的,然后对之后别的电影与这些已知分组(或者就是人工分好组的)的电影进行x求取相似性,最后就能划分好这些分组。
Limitations of Collaborative Filtering
协同过滤的缺陷:
- 冷启动(如何评估那些很少有用户评估过的商品 评估商品很少的用户(他的w和b 很少训练)如何向他进行推荐)
- 如何应用和项目(电影)和用户的额外的信息,加入推荐系统,因为每个人比如相同地域的人,可能有比较相同的偏好之类的这种额外的信息。
Content-based Filtering
Content-based filtering algorithm
之前介绍的都是以协同过滤为导向的推荐系统计算方式,而这种方式的缺点上面也进行了相关的介绍了,所以这边进而提出更为有效的方法,基于内容的过滤算法。
然后这边进行小的总结:
- 协同过滤:推荐的items取决于和你有差不多的相关items评价的投票
- 内容过滤:推荐的items取决于和你有差不多的特征和和你在 items上有差不太多的品味的投票
然后对于内容过滤算法,我们需要收集的不仅仅是之前的投票,还有用户的特征:
这边是把收集的x分成两个部分:
- 用户特征(xu)
- items特征(xm)
而这两个特征的数目多少是不重要的,往往前者取决于数据分析的用户画像,后者才是投票打分得到的数据。
得到这些特征之后,我们需要转向
我们会将xu 和 xm 进行FC多层连接,最后弄成特征维度度相同的,然后进行dot-preduction。
然后就得到了我们新的值,然后自然是返回去更新那些值,至于判断相似性,也还是一样的公式,这边就不进行重复介绍了:
代码理解:
Recommending from a large catalogue
而如果是一个看电影的网站上,我们想要进行推荐,但其中的电影却有着成千上万个,这每一次都进行访问是很不实际的。
所以我们一般把推荐的步骤进行简化成2步:
第一步就是进行检索,换句话来说就是,减少搜索的集合,比如上面的步骤:
- 挑选大量合理的items
- 根据最近该用户看过的电影中,寻找10部最相似的电影(这是可以由服务器提前进行计算的。)
- 最近看过的3种题材中,分别最火的10部电影
- 20部最近最火的电影
- 上面挑选出来的电影取并集,也就是集合去重,然后我们拿这个集合作为他能从中挑选的电影,进行下面的ranking(也可以理解成fine-tune)
第二步当中才是进行计算的过程,而上面第一步的检索,我们实际上,那些选择,都是提前计算得到的,而这一步微调就不行了,用户之间的相关性倒是可以提前算好,但是movie之间的确实需要要用的时候进行运算,但是计算的速度已经大大提升。
Principal Component Analysis(现在用处很少)
对于PCA降维来说,现在的应用已经非常之少了,一般的应用主要就是应用到可视化当中,这边只进行简略的介绍:
最小化相关的垂直距离。
代码实现:
Week3
Reinforcement Learning
基本的模型思路:
首先就是机器agent会先从周围环境当中得到一个state(代表的是环境的state,比如自己所处于的位置之类的信息),然后agent会进行判断Π,得到一个action,然后产生对环境产生影响,环境产生印象之后,会返回一个reward给agent用于评估此次行动的优劣。
基本的网络结构:
这边先介绍一下每一个函数和参数的意思是什么:
- s:代表的是当前的state,状态信息
- a:代表的是下一步的行动action是什么
- Q(state,a):代表的是在当前的state的位置下,选择了a这个action,之后最大的reward是多少(贝尔曼方程定义的)
- γ:就是一个常数,这个值大,代表他更在意未来的收获,小就是眼前的利益。
- R(s):就是处于当前位置s的reward,一般情况下我们会把胜利设为100(较为大的正数),失败设置为(负值),其余情况设置为0。
然后就可以反过来介绍上面的网络模型,这个网络模型用来计算的是Q(),我们拿这个来替代Q函数,什么意思呢,就是输入(s和a),然后会输出一个Q(),作为我们的y,也即Q变成了这个神经网络,有什么用?见下:
然后计算就有:
于是就可以进行梯度下降了
注意fwb需要用到Q,y也需要使用到Q,也就是都需要用到我们的神经网络的计算,但是也会让这个越减越少。
或者换种说法,上面的Q的计算都换成神经网络计算即可,然后我们用贝尔曼方程计算出来的值,当作是真实的标签
这边的Q需要使用神经网络进行计算
然后直接采用:
又会得到另一个y。
此时两个y作均方误差,也就是上面的梯度下降了。
batch and soft-update
直接给两张图,由于都十分好理解:
注意看图之间的差别,现代深度学习一般都采用batch训练法,而不是一次性输入所有数据进行训练。
软更新,现在用的也有点少,但是碰到问题的时候需要注意这个东西存在,以此帮助我们解决问题。