Q-Learning

Q-Learning 是一个强化学习中一个很经典的算法,其出发点很简单,就是用一张表存储在各个状态下执行各种动作能够带来的 reward,如下表表示了有两个状态 s1,s2s1,s2,每个状态下有两个动作 a1,a2a1,a2, 表格里面的值表示 reward

在这里插入图片描述

这个表示实际上就叫做 Q-Table,里面的每个值定义为 Q(s,a)Q(s,a), 表示在状态 ss 下执行动作 aa 所获取的reward,那么选择的时候可以采用一个贪婪的做法,即选择价值最大的那个动作去执行。 Q-Table 要如何获取?答案是随机初始化,然后通过不断执行动作获取环境的反馈并通过算法更新 Q-Table

Deep Q Network

DQN与Q-leanring类似都是基于值迭代的算法,但是在普通的Q-learning中,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,使用Q-Table不动作空间和状态太大十分困难。

所以可以把Q-table更新转化为一函数拟合问题,通过拟合一个函数function来代替Q-table产生Q值,使得相近的状态得到相近的输出动作。因此我们可以想到深度神经网络对复杂特征的提取有很好效果,所以可以将DeepLearning与Reinforcement Learning结合。这就成为了DQN。

通过 NN 预测出Q(s2, a1) 和 Q(s2,a2) 的值, 这就是 Q 估计. 然后我们选取 Q 估计中最大值的动作来换取环境中的奖励 reward. 而 Q 现实中也包含从神经网络分析出来的两个 Q 估计值, 不过这个 Q 估计是针对于下一步在 s’ 的估计。

在这里插入图片描述

DQN 的实现会遇到许多困难,其中最显著的就是:

Read more »

LeNet‑5

LeNet‑5的复杂度远远无法和今天的深度网络模型相比,性能也相差悬殊,但在当时取得了和支持向量机相媲美的效果,并被广泛应用于识别手写数字,受到了广泛的关注。

在这里插入图片描述

在LeNet提出后,很长一段时间卷积神经网络并不是计算机视觉领域的主流方法,因为LeNet只在小数据集上表现良好,在规模更大、更真实的数据集上表现一般

AlexNet

2012年的冠军AlexNet[13]首次将深度学习技术应用到大规模图像分类领域,证明了深度学习技术学习到的特征可以超越手工设计的特征,开启了计算机视觉领域中的深度学习热潮。AlexNet和LeNet结构理念相似,采用5层卷积层和3层全连接层,激活函数用ReLU取代了sigmoid,用dropout方法取代了权重衰减缓解过拟合。

在这里插入图片描述

VGG

VGG 最大的特点就是通过比较彻底地采用 3x3 尺寸的卷积核来堆叠神经网络,这样也加深整个神经网络的深度。这两个重要的改变对于人们重新定义卷积神经网络模型架构也有不小的帮助,至少证明**使用更小的卷积核并且增加卷积神经网络的深度,可以更有效地提升模型的性能。**VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。

该网络中的亮点: 通过堆叠多个3x3的卷积层来替代大尺度卷积层(在拥有相同感受野的前提下能够减少所需参数)。

Read more »

牛顿冷却场景

需求场景:根据用户的投票,决定最近一段时间内的”热文排名”,如电商热榜排名,贴吧热贴排名。社区体系中,与一篇内容相关的指标如下:

在这里插入图片描述

我们可以把”热文排名”想象成一个”自然冷却”的过程:

1、任一时刻,网站中所有的文章,都有一个”当前温度”,温度最高的文章就排在第一位

2、如果一个用户对某篇文章投了赞成票,该文章的温度就上升一度

3、随着时间流逝,所有文章的温度都逐渐”冷却”

这样假设的意义,在于我们可以照搬物理学的冷却定律,使用现成的公式,建立”温度”与”时间”之间的函数关系,轻松构建一个”指数式衰减”(Exponential decay)的过程。

物理学家牛顿,早在17世纪就提出了温度冷却的数学公式,被后人称作”牛顿冷却定律”(Newton’s Law of Cooling)。

在这里插入图片描述

“牛顿冷却定律”非常简单,用一句话就可以概况:

本期温度 = 上一期温度 x exp(-(冷却系数) x 间隔的小时数)

Read more »

TensorFlow 是一个端到端开源机器学习平台。它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先进机器学习技术的发展,并使开发者能够轻松地构建和部署由机器学习提供支持的应用。

常见机器学习问题的解决方案:

新手:图像分类

中级:推荐系统,预测用户行为

高级:生成对抗网络,如使用Keras Subclassing API训练生成对抗网络生成手写数字图像

Google开源了基于Tensorflow的推荐器, 一个新的开源Tensorflow包。它的特点可以总结为下面四个:

它有助于开发和评估灵活的候选nomination模型;

它可以很容易地将商品、用户和上下文信息合并到推荐模型中;

它可以训练多任务模型,帮助优化多个推荐目标;

它使用TensorFlow Serving为最终模型提供服务。

TensorFlow Recommenders是使用TensorFlow构建推荐系统模型的库。它有助于构建推荐系统的完整工作流程,包括:数据准备、模型制定、模型训练、模型评估和部署等

该模型是建立在Keras之上的,更加便于构建复杂模型。

Tensorflow Recommenders

TensorFlow Recommenders支持:

建立并评估灵活的推荐检索模型

自由地将item、user和上下文信息合并到推荐模型中

联合训练多目标推荐的多任务模型

Read more »

核心思想

Wide & Deep 模型的核心思想是结合线性模型的记忆能力和 DNN 模型的泛化能力,在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。Wide & Deep 已成功应用到了 Google Play 的APP推荐业务,并于TensorFlow中封装。该结构被提出后即引起热捧,在业界影响力非常大,很多公司纷纷仿照该结构并成功应用于自身的推荐等相关业务。

记忆(memorization)即从历史数据中发现item或者特征之间的相关性。
泛化(generalization)即相关性的传递,发现在历史数据中很少或者没有出现的新的特征组合。

举个例子来解释下:在人类的认知学习过程中演化过程中,人类的大脑很复杂,它可以记忆(memorization)下每天发生的事情(麻雀可以飞,鸽子可以飞)然后泛化(generalization)这些知识到之前没有看到过的东西(有翅膀的动物都能飞)。 但是泛化的规则有时候不是特别的准确,有时候会出错(有翅膀的动物都能飞吗)。这时候就需要记忆(memorization)来修正泛化的规则(generalization rules),叫做特例(企鹅有翅膀,但是不能飞)。这就是memorization和generalization的来由或者说含义。

现有模型的问题

  • 线性模型LR简单、快速并且模型具有可解释,有着很好的拟合能力,但是LR模型是线性模型,表达能力有限,泛化能力较弱,需要做好特征工程,尤其需要交叉特征,才能取得一个良好的效果,然而在工业场景中,特征的数量会很多,可能达到成千上万,甚至数十万,这时特征工程就很难做,还不一定能取得更好的效果。 推荐用户之前有过行为的items
  • DNN几乎不需要特征工程,就可以取得很好的效果,DNN可以自动交叉特征,通过对低纬度的dense embedding进行组合可以学习到更深层次的隐藏特征,尤其是可以学到高阶特征交互,具有很好的泛化能力。另外,DNN通过增加embedding层,可以有效的解决稀疏数据特征的问题,防止特征爆炸。推荐系统中的泛化能力是很重要的,可以提高推荐物品的多样性。但是DNN在拟合数据上相比较LR会较弱,缺点是有点over-generalize(过度泛化)。推荐系统中表现为:会给用户推荐不是那么相关的物品,尤其是user-item矩阵比较稀疏并且是high-rank(高秩矩阵)。趋向于提高推荐系统的多样性。

总之:

  1. 线性模型无法学习到训练集中未出现的组合特征;
  2. FM或DNN通过学习embedding vector虽然可以学习到训练集中未出现的组合特征,但是容易过度泛化。

Wide & Deep

为了提高推荐系统的拟合性和泛化性,可以将LR和DNN结合起来,同时增强拟合能力和泛化能力,wide&deep就是将LR和DNN组合起来,wide部分就是LR,deep部分就是DNN,将两者的结果组合进行输出。
在这里插入图片描述

Read more »

  中文分词算法是指将一个汉字序列切分成一个一个单独的词,与英文以空格作为天然的分隔符不同,中文字符在语义识别时,需要把数个字符组合成词,才能表达出真正的含义。分词算法是文本挖掘的基础,通常应用于自然语言处理、搜索引擎、智能推荐等领域。

分词算法分类

  中文分词算法大概分为三大类,第一类是基于字符串匹配,即扫描字符串,如果发现字符串的子串和词典中的词相同,就算匹配,比如机械分词方法。这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”,“长词优先”等。第二类是基于统计以及机器学习的分词方法,它们基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行训练,在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。常见的序列标注模型有HMM和CRF。这类分词算法能很好处理歧义和未登录词问题,效果比前一类效果好,但是需要大量的人工标注数据,以及较慢的分词速度。第三类是通过让计算机模拟人对句子的理解,达到识别词的效果,由于汉语语义的复杂性,难以将各种语言信息组织成机器能够识别的形式,目前这种分词系统还处于试验阶段。

img

机械分词算法

  机械分词方法又叫基于字符串匹配的分词方法,它是按照一定的策略将待分析的字符串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。这是最简单的分词方法,但非常高效和常见。

  机械分词方法按照扫描方向的不同,可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种机械分词方法如下:

​ 正向最大匹配法(由左到右的方向);如以例句“达观数据是一家大数据公司”,使用正向最大匹配法分词的结果为“达观/数据/是一/家/大数据/公司”

  逆向最大匹配法(由右到左的方向);同样以例句“达观数据是一家大数据公司”,使用逆向最大匹配法分词的结果为“达观/数据/是/一家/大数据/公司”

基于统计的分词方法
Read more »

1、下载二进制版本安装包。这里以 5.7.11 版本为例。 

2、我装在/usr/local目录下面,把下载的mysql包放在这个文件夹下面,执行以下命令,期间建立一个mysql的软连接。

1
2
3
# tar -zxvf mysql-5.7.12-linux-glibc2.5-x86_64.tar.gz
# ln -s mysql-5.7.12-linux-glibc2.5-x86_64 mysql
# cd mysql

3、在mysql创建一个data目录,用于存放数据文件。执行以下命令: 需要修改路径避免磁盘爆满

1
2
3
4
5
6
# groupadd mysql
# useradd -r -g mysql -s /bin/false mysql
# mkdir data
# chown -R root:root .
# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data

软链接至数据分区:

1
2
3
4
5
6
7
8
mkdir -p /data/mysql/{data,binlogs,log,etc,run}
ln -s /data/mysql/data /usr/local/mysql/data
ln -s /data/mysql/binlogs /usr/local/mysql/binlogs
ln -s /data/mysql/log /usr/local/mysql/log
ln -s /data/mysql/etc /usr/local/mysql/etc
ln -s /data/mysql/run /usr/local/mysql/run
chown -R mysql.mysql /data/mysql/
chown -R mysql.mysql /usr/local/mysql/{data,binlogs,log,etc,run}

记住密码:

4、完成上述工作,配置my.cnf。修改 /etc/my.cnf。(也可从 /usr/local/mysql/support-files 子目录下找到一个叫 my-default.cnf 的配置样例文件,复制到/etc)执行命令。

1
2
3
4
复制命令:
# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
修改命令:
# vi /etc/my.cnf
Read more »

简介

Kubernetes,又称为 k8s(首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s,所以简称 k8s)或者简称为 “kube” ,是一种可自动实施 Linux 容器操作的开源平台。它可以帮助用户省去应用容器化过程的许多手动部署和扩展操作。可以将运行 Linux 容器的多组主机聚集在一起,由 Kubernetes 帮助您轻松高效地管理这些集群。这些集群可跨公共云、私有云或混合云部署主机。对于要求快速扩展的云原生应用而言(例如借助 Apache Kafka 进行的实时数据流处理),Kubernetes 是理想的托管平台。

Kubernetes 最初由 Google 的工程师开发和设计。Google 是最早研发 Linux 容器技术的企业之一(组建了cgroups),曾公开分享介绍 Google 如何将一切都运行于容器之中(这是 Google 云服务背后的技术)。Google 每周会启用超过 20 亿个容器——全都由内部平台 Borg 支撑。Borg 是 Kubernetes 的前身,多年来开发 Borg 的经验教训成了影响 Kubernetes 中许多技术的主要因素。

能做什么

image

  • 可以动态的对应用进行扩容
  • 可以仅仅使用需要的资源(模块化),达到优化硬件的目的
  • 可以无缝的发布应用,包括自动发布,自动重启,自动复制….

优势

  • Go语言开发
  • 轻量级-消耗资源小
  • 开源
  • 弹性伸缩
  • 负载均衡

传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。

为什么是容器?

Read more »

在这里插入图片描述

填充(Padding)

前面可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。

这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“IMG_256”来进行填充的。

【步长(Stride)】

卷积过程中,有时需要通过padding来避免信息损失,有时也要在卷积时通过设置的**步长(Stride)**来压缩一部分信息,或者使输出的尺寸小于输入的尺寸。

*Stride***的作用:**是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3。以此类推。

【卷积的计算公式】

在这里插入图片描述

【多通道卷积】

Read more »