深度学习分类推荐

2018-12-22 00:11:17 u011240016 阅读数 2661

内容大纲

  • 分类和回归之外的机器学习形式
  • 评估机器学习模型的规范流程
  • 为深度学习准备数据
  • 特征工程
  • 解决过拟合问题
  • 处理机器学习问题的通用流程

监督学习的主要种类及其变种

主要包括两大类问题:

  • 分类
  • 回归

变种问题主要有:

  • 序列生成:给定一张图像,输出描述图像的文字;可以被重新表示为分类问题
  • 语法树预测:给定一个句子,输出其分解生成的语法树
  • 目标检测:给定一张图像,在图中的目标周围绘制一个边界框;可以被表示为分类问题,或者分类与回归联合问题
  • 图像分割:给定图像,在特定的物体上画一个像素级别的mask

无监督学习

不给定目标值,模型需要从输入数据中寻找到有价值的变换,常常用来做数据可视化,数据压缩,数据去噪或者辅助我们更好理解数据中的相关性等。

无监督学习是数据分析的必备技能。

为了更好的理解数据集,无监督学习是一个必要步骤。比如降维和聚类分析方法。

自监督学习

这个是监督学习的一个特例。它的特殊之处在于没有人工标注的标签,但是标签仍然存在,而这些标签是如何生成的呢?它们来自输入数据,常常用启发式算法来生成。

强化学习

智能体接收有关环境的信息,并学会选择使得奖励函数最大化的动作。

部分术语解析

  • 二分类:每个输入样本被划分到两个互斥的类别之一
  • 多分类:每个输入样本被划分到两个以上的类别之一,如手写体数字分类
  • 多标签分类:每个输入样本都可以被划分到多个标签,如图像标注任务
  • 标量回归:输出一个标量,连续值
  • 向量回归:输出一组连续值的任务,比如输出图像中物体的边界框
  • 小批量,批量:模型同时处理的一部分样本,通常取2的幂,便于GPU分配内存

模型评估

训练集,验证集和测试集

三者的具体分工是:在训练集上训练模型,在验证集上评估模型以及在测试集上最后测试。

在验证集上可以调节超参数,比如前面训练时,我们用验证集上的效果来得出训练多少轮次合适,这就是超参数选择的过程。调节模型时,是万万不能用到测试集的,测试集就像最后的高考,验证集则是月考,训练集则是我们平时的作业。

三种经典的评估方法

  • 留出验证
  • K折验证
  • 含打乱数据的重复验证

留出验证

即留出一定比例的数据作为测试集,为了调节模型我们还需要从训练集中拿出一部分数据做验证集。

在这里插入图片描述

这个图只表达了划分出两部分数据,训练集里还要再细分出一部分数据做验证,本质上,验证集也是训练调节模型,大类仍可归于训练集。

num_validation_samples = 10000
np.random.shuffle(data) # 打乱数据
validation_data = data[:num_validation_samples] # 验证集
train_data = data[num_validation_samples:]

model = build_model()
model.fit(train_data, train_targets)
validation_score = model.evaluate(validation_data) # 验证集上评估模型并得出最优超参数

# 找到最优超参数,重新训练
model = build_model()
model.fit(np.concatenate([train_data, validation_data], train_targets)
test_score = model.evaluate(test_data) 

在知晓超参数以后,重新训练模型时,验证集数据也作为训练集数据,这样可以更好的训练模型。

这个验证方法不适用于样本数据量较少的情况。

K折验证

在这里插入图片描述

这个一图就说明白了,但还是需要特别强调一下,这里的数据确定后是个整体,当然之前可以先打乱使得分布均匀。然后砍成一段一段的,拼在一起就是完整的数据集。之所以这么强调,是为了和下面的打乱随机K折验证区分一下。

k = 3
num_validation_samples = len(data) // k

np.random.shuffle(data)
validation_scores = [] # 每一折得出一个验证分数
for fold in range(k):
    validation_data= data[num_validation_samples * fold: num_validation_samples * (fold + 1)]
    train_data = data[:num_validation_samples * fold] + data[num_validation_samples * (fold + 1):]
    
    model = build_model()
    model.fit(train_data)
    validation_score = model.evaluate(validation_data)
    validation_scores.append(validation_score)
    
validation_score = np.average(validation_scores)

model = build_model()
model.fit(data)
test_score = model.evaluate(test_data) 

包含打乱数据的重复K折验证

一句话描述就是,多次使用上面的K折验证,每次都打乱数据一下。假设重复P次,那么需要训练和评估的模型个数是PxK个,这种做法代价很大,但是效果很好,在Kaggle比赛里很有用。

评估模型的注意事项

数据代表性

将数据随机打乱,可以使得训练集和测试集都能代表当前数据。

时间箭头

如果是用过去数据来预测未来,则不能随机打乱数据,否则会导致时间泄露问题。

数据冗余

我们需要保证训练集和验证集之间不存在交集。

数据预处理,特征工程,特征学习

在具体使用模型之前,需要耗费很大精力来处理数据。

数据预处理

针对神经网络,我们将数据处理得更加适用于神经网络处理。主要包括如下几种方法:

  • 向量化
  • 标准化
  • 缺失值处理
  • 特征提取

特征工程

通常机器学习模型无法从完全任意的数据中学习。所以我们需要利用先验知识对数据进行编码转换,以改善模型的效果。

特征工程的本质是:用更简单的方式表述问题,使得问题更加容易解决。这需要我们深入理解问题。

现代深度学习,大部分特征工程是不需要的。神经网络可以从原始数据中自动提取有用特征。但是并不表示深度神经网络不需要特征工程。使用特征工程,一方面可以用更少的资源解决问题,另一方面,定义良好的特征可以更少的数据解决问题。样本很少时,恰当的特征工程价值极大。

处理过拟合和欠拟合问题

欠拟合表示模型仍有改进的空间,还需要继续训练,所以这个问题不大,更需要特别设计解决的是过拟合问题。降低过拟合的方法叫作正则化。常用的正则化的方法有:

  • 减小网络大小
  • 添加权重正则化
    • L1
    • L2
  • 添加dropout正则化

减小网络大小

这是防止过拟合的最简单的方法,通过减少模型的学习参数个数。

**模型容量:**可学习参数的个数。

深度学习模型通常都很擅长拟合训练数据,但是真正的挑战在于泛化,而不是拟合。

更大的网络的训练损失容易很快就接近0,即网络的容量越大,则拟合数据的速度就越快,也就容易过拟合。

添加权重正则化

from keras import regularizers

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu'))
model.add(layers.Dense(1, kernel_regularizer=regularizers.l2(0.001), activation='relu'))

其中,l2(0.001)的意思是:该层权重矩阵的每个系数都会使网络总损失增加0.001 * weight_coefficient_calue,惩罚项只在训练时添加,测试时不计算,所以训练损失会大于测试损失。

添加dropout正则

这是训练神经网络最有效也最常用的方法。对某一层使用dropout,会在训练过程中随机将该层的一些输出特征置为0。设置的dropout比率是元素被设置为0的比例。测试时没有单元会被舍弃。

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

深度学习流程

这部分再单独写一篇笔记,之前也写过一次。

END.

参考:

《Deep Learning with Python》

2018-06-25 10:30:11 zong596568821xp 阅读数 7062

参考:https://www.jianshu.com/p/b960305718f1

在做图像识别相关任务时,对于识别效果没有提出明确的评价指标或预期目标,调试时单纯依靠“感觉”调参,显然不是一种合理的方法,因此整理相关评价指标,作为参数调试的相关依据。

根据深度学习的任务不同,评价标准也不同,分类任务和回归任务的评价指标如下

  • 分类:accuracy、误分类率、precision、recall、F1 score、ROC 曲线、AUC、PR曲线、AP、mAP等
  • 回归:MAE、MSE

本文主要讲解在分类任务中的评价指标,具体含义如下

基础背景

根据分类时预测与实际的情况,作出如下表格,称为混淆矩阵,其中1代表正类,0代表负类,Predicted代表预测,Actual代表实际

    Predictd     Predicted 合计
    1 0  
Actual 1        D:TP C:FN D+C:Actual Positive
Actual 0 B:FP A:TN A+B:Actual Negative
合计      D+B:Predicted Positive A+C:Predicted Negative  

 

  • A:TN=True Negative 真负,将负类预测为负类的数量
  • B:FP=False Positive 假正,将负类预测为正类的数量,可以称为误报率
  • C:FN=False Negative 假负,将正类预测为负类的数量,可以称为漏报率
  • D:TP=True Positve 真正,将正类预测为正类的数量
  • A+B:Actual Negative 实际上负类的数量
  • C+D:Actual Positive 预测的负类数量
  • A+C:Predicted Negative 预测的负类数量
  • B+D:Predicted Positive 预测的正类数量

accuracy

准确率=正确预测的正反例数/总数

ACC=(TP+TN)/(TP+TN+FP+FN)=(A+D)/(A+B+C+D)

误分类率

误分类率=错误预测的正反例数/总数

误分类率=(FP+FN)/(TP+TN+FP+FN)=(B+C)/(A+B+C+D)=1-ACC

precision

查准率、精确率=正确预测到的正例数/预测正例总数

precision=TP/(TP+FP)=D/(B+D)

recall

查全率、召回率=正确预测到的正例数/实际正例总数

recall=TP/(TP+FN)=D/(C+D)

F1 score

F1 score 为精确率与召回率的调和均值

2/F1 = 1/P+1/R

F1 score = 2TP/(2TP+FP+FN)

准确率accuracy和精确率precision都高的情况下,F1 score也会显得很高

精确率是针对预测结果而言的,表示的是预测为正的样本中有多少是真正的正样本,预测为正就有两种可能,一种是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),即 P = TP / (TP+FP)

召回率是针对原来样本而言的,表示的是样本中的正例有多少被预测正确,同样也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN),即 R = TP / (TP+FN)

ROC curve

逻辑回归里面,对于正负例的界定,通常会设一个阈值,大于阈值的为正类,小于阈值为负类。如果我们减小这个阀值,更多的样本会被识别为正类。提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了直观表示这一现象,此处引入ROC,ROC曲线可以用于评价一个分类器好坏。

ROC关注两个指标:

  • True Positive Rate: TPR = TP / (TP+FN) → 将正例分对的概率
  • Fales Positive Rate: FPR = FP / (FP+TN) → 将负例错分为正例的概率

在 ROC 空间中,每个点的横坐标是 FPR,纵坐标是 TPR,这也就描绘了分类器在 TP(真正率)和 FP(假正率)间的 trade-off。

ROC曲线中的四个点和一条线:

  • 点(0,1):即FPR=0, TPR=1,意味着FN=0且FP=0,将所有的样本都正确分类;
  • 点(1,0):即FPR=1,TPR=0,最差分类器,避开了所有正确答案;
  • 点(0,0):即FPR=TPR=0,FP=TP=0,分类器预测所有的样本都为负样本(negative);
  • 点(1,1):分类器实际上预测所有的样本都为正样本。

总之:ROC曲线越接近左上角,该分类器的性能越好。

AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。随机挑选一个正样本以及一个负样本,分类器判定正样本的值高于负样本的概率就是 AUC 值。总之:AUC值越大的分类器,正确率越高。

  • AUC = 1:绝对完美分类器,理想状态下,100%完美识别正负类,不管阈值怎么设定都能得出完美预测,绝大多数预测不存在完美分类器;
  • 0.5<AUC<1:优于随机猜测。这个分类器(模型)妥善设定阈值的话,可能有预测价值;
  • AUC=0.5:跟随机猜测一样(例:随机丢N次硬币,正反出现的概率为50%),模型没有预测价值;
  • AUC<0.5:比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在AUC<0.5的状况。

 

既然已经这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反)

PR曲线

PR曲线即查准率(Precision)与查全率(Recall),以查全率为坐标x轴,查准率为坐标y轴,从而画出了一条曲线。

P-R图直观地显示出学习器在样本总体上的查全率和查准率。在进行比较时,若一个学习器的P-R曲线完全被另一个学习器的曲线完全“包住”,则我们就可以断言后者的性能优于前者。

若想评估一个分类器的性能,一个比较好的方法就是:观察当阈值变化时,Precision与Recall值的变化情况。如果一个分类器的性能比较好,那么它应该有如下的表现:在Recall值增长的同时,Precision的值保持在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡。

AP与mAP

严格的AP就是PR曲线下的面积,mAP就是所有类AP的算术平均

但是一般都是用逼近的方法去估计这个面积,比如 

approximated precision的方法:每个recall point都approximate,计算每个矩形面积求和(下图红色虚线) 

Interpolated Precision的方法:从每个recall point往后看,用最大的precision作为插值来,计算每个矩形面积求和(下图蓝色虚线) 

从PASCAL VOC 2007开始,就是用的类似Interpolated Precision的方法,不过稍有不同的是,VOC使用的是在固定的11个recall([.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.])的地方取precision然后来近似AP,所以又叫11-point interpolated average precision。

而从PASCAL VOC 2010开始,又摈弃了11-point interpolated average precision的计算方法,取而代之的是用所有的(recall, precision)数据点(只要是recall有改变的地方)来计算AP。具体而言就是,取所有recall改变的数据点及其后的最大的precision作为当前recall的precion(这样就能得到一条单调递减的(recall, precision)曲线)来计算矩形面积,然后累加所有小矩形,即得AP。 

用上述方法分别算出各个类的AP,然后取平均,就得到mAP了。AP的计算可以直接统计该类别下的TP,FP和postitive number的总数,然后就可以一次性算出AP了。得到了各类的AP,mAP就是各类别AP的算术平均!mAP的好处是可以防止AP bias到某一个数量较多的类别上去。

 
2018-03-24 22:08:41 dengheCSDN 阅读数 6959

给大家推荐一个学习深度学习的好网站:

http://www.leadai.org/

个人感觉里面的东西很受用,值得一看。

还有一个算法学习笔记:http://www.cnblogs.com/Anker/category/436374.html

2012-08-04 09:49:03 abcjennifer 阅读数 403943

Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,最近研究了机器学习中一些深度学习的相关知识,本文给出一些很有用的资料和心得。


Key Words:有监督学习与无监督学习,分类、回归,密度估计、聚类,深度学习,Sparse DBN,


1. 有监督学习和无监督学习


给定一组数据(input,target)为Z=(X,Y)。

有监督学习:最常见的是regression & classification

regression:Y是实数vector。回归问题,就是拟合(X,Y)的一条曲线,使得下式cost function L最小。


classification:Y是一个finite number,可以看做类标号。分类问题需要首先给定有label的数据训练分类器,故属于有监督学习过程。分类问题中,cost function L(X,Y)是X属于类Y的概率的负对数。

,其中fi(X)=P(Y=i | X);


无监督学习:无监督学习的目的是学习一个function f,使它可以描述给定数据的位置分布P(Z)。 包括两种:density estimation & clustering.

density estimation就是密度估计,估计该数据在任意位置的分布密度

clustering就是聚类,将Z聚集几类(如K-Means),或者给出一个样本属于每一类的概率。由于不需要事先根据训练数据去train聚类器,故属于无监督学习。

PCA和很多deep learning算法都属于无监督学习。



2. 深度学习Deep Learning介绍

   Depth 概念:depth: the length of the longest path from an input to an output.

   Deep Architecture 的三个特点:深度不足会出现问题;人脑具有一个深度结构(每深入一层进行一次abstraction,由lower-layer的features描述而成的feature构成,就是上篇中提到的feature hierarchy问题,而且该hierarchy是一个稀疏矩阵);认知过程逐层进行,逐步抽象

   3篇文章介绍Deep Belief Networks,作为DBN的breakthrough


3.Deep Learning Algorithm 的核心思想:

    把learning hierarchy 看做一个network,则

    ①无监督学习用于每一层网络的pre-train;

    ②每次用无监督学习只训练一层,将其训练结果作为其higher一层的输入;

    ③用监督学习去调整所有层

这里不负责任地理解下,举个例子在Autoencoder中,无监督学习学的是feature,有监督学习用在fine-tuning. 比如每一个neural network 学出的hidden layer就是feature,作为下一次神经网络无监督学习的input……这样一次次就学出了一个deep的网络,每一层都是上一次学习的hidden layer。再用softmax classifier去fine-tuning这个deep network的系数。



这三个点是Deep Learning Algorithm的精髓,我在上一篇文章中也有讲到,其中第三部分:Learning Features Hierachy & Sparse DBN就讲了如何运用Sparse DBN进行feature学习。


4. Deep Learning 经典阅读材料:

阐述Deep learning主要思想的三篇文章:
06年后,大批deep learning文章涌现,感兴趣的可以看下大牛Yoshua Bengio的综Learning deep architectures for {AI},不过本文很长,很长……

5. Deep Learning工具—— Theano

     Theano是deep learning的Python库,要求首先熟悉Python语言和numpy,建议读者先看Theano basic tutorial,然后按照Getting Started 下载相关数据并用gradient descent的方法进行学习。

学习了Theano的基本方法后,可以练习写以下几个算法:

有监督学习:

  1. Logistic Regression - using Theano for something simple
  2. Multilayer perceptron - introduction to layers
  3. Deep Convolutional Network - a simplified version of LeNet5


无监督学习:




最后呢,推荐给大家基本ML的书籍:



关于Machine Learning更多的学习资料将继续更新,敬请关注本博客和新浪微博Sophia_qing


References:

1. Brief Introduction to ML for AI

2.Deep Learning Tutorial

3.A tutorial on deep learning - Video




2018-03-05 14:50:12 free356 阅读数 5822

基于深度学习的推荐系统研究

论文信息:北京邮电大学   陈达  14年硕毕论

目的:深度网络学习算法应用到推荐系统

为此工作:

1)研究分析基于内容的推荐系统和基于协同过滤的推荐系统,包括基于相似度的最近邻方法朴素贝叶斯方法潜在因素的矩阵分解方法,分析了各自的优缺点

2)研究一个典型的深度网络模型——多层受限波兹曼机(DBN

3)将深度网络与传统协同过滤方法相结合,建立一个新的深度网络混合模型,采用有限步吉布斯采样的最小化散度差算法对深度模型的似然函数求解,可以训练一个深度网络系统

4)在多个数据集上,将此方法和传统方法进行对比,证明深度网络学习方法在特征提取上具有不错能力,用在推荐系统上比协同过滤方法有更好的抗噪性和有效性。 

内容一(传统算法优缺点)

1,基于内容的推荐算法:TF-IDF,朴素贝叶斯。

2,基于协同过滤的推荐算法:根据相似用户的最近邻,潜在因素的矩阵分解。

内容二(深度网络结构):

背景知识1神经网络的神经元,sigmoid神经元

              

                                    

对于一个单层的推断结构利用梯度下降的方式学习权值:

         

上述公式中,字母依次分别代表学习速率,0,1二值,推断的概率。

背景知识2波兹曼机

波兹曼机是由随机神经元函数(sigmoid)组成的随机机器,每个节点的状态只能是“开”和“关”两种状态,用01来表示,这里的01状态的意义是代表了模型会选取哪些节点来使用,处于激活状态的节点被使用,未处于激活状态的节点未被使用。节点的激活概率由可见层和隐藏层节点的分布函数计算。其神经元分成两部分功能组一一下面一层的可见层神经元和上面一层的隐含层祌经元。在网络的训练阶段所有的可见神经元都被钳制在环境所决定的特定状态,而隐藏神经元总是自由运行的。

 

背景知识3波兹曼机统计力学与吉布斯分布

有许多自由度的物理系统,它可以驻留在大量可能状态中的任何一个。P表示状态概率,E表示状态的能量(PE一一对应),当系统和周围环境处于热平衡状态时一个基本的状态的发生概率为:

 

其中T为幵尔文绝对摄氏度,K为波兹曼常数,再根据概率之和为1可以得到在某个状态E下联合概率分布函数:

 

上述分布即符合吉布斯分布。吉布斯分布一个重要的性质:能量低的状态比能量高的状态发生概率较高。

背景知识4受限波兹曼机

普通波兹曼机简化成了受限波兹曼机,受限波兹曼机隐含层与隐含层之间无连接,可见层与可见层之间无连接,如下:

 

在可见层和隐含层加入了偏好之后的受限波兹曼机的联合能量函数为:

 

其中i,j分别为可见层和隐含层神经元的个数,a可见层偏好,b为隐含层偏好,w为可见层和隐含层的连接权值。而可见层单元根据不同的应用情景有不同的取值范围和不同的神经元函数。

整个网络在状态X下的概率用能量函数表示:

 

这里注意vh为可见层向量和隐含层状态向量,状态X下的联合概率分布为:

 

由于隐含层与隐含层之间无连接,可见层与可见层之间无连接,更重要的性质是:当给定了可见层的数据之后隐含层之间是条件独立的,给定了隐含层的数据之后可见层之间是条件独立的。

当给定可见层状态时,隐含层的某一个单元处于“激活”态概率为:

 

当给定隐含层状态时,可见层某一单元处于“激活”态概率为:

 

背景知识5多层波兹曼机

 

该图的最下层为可见层V,可见层之上的均为隐含层H,在多层情况下以三层为例,整个网络的联合能量函数为:

 

网络在状态X下的联合概率

 

在深度置信网络中利用最顶两个隐含层作为无向的关键记忆层(如图的双向箭头),将关联记忆表征的信息可以通过网络的重构反应到整个网络的参数上去,这样就可以进行“重复”学习的过程。

J表示可见层的输入数据,通常来说波兹曼机的运行状态分为两个阶段:

1,正向推断,这时整个网络在钳制环境下即在输入数据的直接影响下运行;

2,负向阶段,这个阶段中网络自由运行,隐含层不断自行推断进行状态转移,并且没有环境输入。那么深度结构波兹曼机的整个网络快速学习权值过程大致如图所示:

 

上图显示了一个快速的学习过程,向上的箭头表示利用该层钳制的数据和权值正向推断的过程,向下的箭头表示作为生成模型,模型重构出来的数据,而且网络的参数是一层一层地向上学习,也就是说当底层参数学习完毕后,将底层向上正向推断的数据作为可见层数据,再向上正向推断学习。

理解参考:https://www.cnblogs.com/jhding/p/5687696.html

内容三(深度结构模型的推荐算法):

一:深度模型

将深度波兹曼机的模型和传统最近邻的方法相结合,利用深度波兹曼机对高维数据的特征抽象表达能力和最近邻直观的而快速的打分预测能力,组成一个新的模型,对己存在的方法进行改进和提升,使其能够充分利用两个模型中出色特点避免两者中的缺点,扬长避短。

 

绿色框部分代表深度学习结构,用模型对训练数据进行输入,并利用无监督学习的方法训练深度网络,该深度模型一共有四层,包括可见层v1,隐含层h1、隐含层h2和隐含层h3,而顶层与隐含层h3形成无向的关联记忆层。

当数据通过深度结构进行深层映射后,从原来的M维(M为输入数据的维度)变成了最顶层的K维数(K为深度模型最顶层神经元的维度),这样我们认为原来高维数据通过特征探测群进行映射后,将数据内部隐含的特征映射到K维空间中。

比如,对于电影打分数据,我们将映射后的K维空间可以理解成该用户对M部电影的偏好特征,1-K个维度分别代表用户喜爱某个演员的程度、喜欢某个类型影片的程度、喜欢某个导员的程度等等,在这K个维度上我们对每个用户的数据进行聚类或者相似度比较,则相似度比较的结果往往比用原始数据进行比较的准确度要高。

二:多层模型的训练方法

要确定这个模型要知道模型的三个参数,下面就围绕着参数的求解进行分析。

参数求解用到了似然函数的对数对参数求导。由于从可知,能量E和概率P是成反比的关系,所以通过最大化P,才能使能量值E最小。最大化似然函数常用的方法是梯度上升法,梯度上升法是指对参数进行修改按照以下公式:

 

通过求关于的导数,即,然后对原值进行修改。如此迭代使似然函数P最大,从而使能量E最小。

对数似然函数对参数求导分析:

首先是对数似然函数的格式: 表示模型的输入数据。然后对里的参数分别进行求导,详细的推导过程就不写了:

 

由于上面三式的第二项中都含有 中仍然含有参数,所以它是式中求不出来的。所以,有很多人就提出了一些通过采样逼近的方法来求每一个式子中的第二项。

求解的算法:

1 Gibbs采样算法

因为在上一章节末尾讲对参数的求导中仍然存在不可求项表示可见层节点的联合概率。所以,要想得到 的值,就得要逼近它,求它的近似值。

Gibbs采样的思想是虽然不知道一个样本数据的联合概率P(x),但是知道样本中每一个数据的条件概率 (假设每一个变量都服从一种概率分布),则我可以先求出每一个数据的条件概率值,得到x的任一状态 。然后,我用条件概率公式迭代对每一个数据求条件概率。最终,迭代k次的时候,x的某一状态将收敛于x的联合概率分布P(x)

对于RBM来讲,则执行过程如图3所示:

                

3 Gibbs采样过程

求解过程是:假设给我一个训练样本v0,根据公式  h0中每个节点的条件概率,再根据公式 v1 中每个节点的条件概率,然后依次迭代,直到执行K步(K足够大),此时的概率将收敛于P(v)的概率。如下所示:

                           

 2CD-k算法

CD算法是需要k次(k=1Gibbs采样对可见层节点进行重构得到可见层节点的概率分布。其思想是:假设给模型一个样本v0,通过求所有隐藏层节点的概率值,然后每一个概率值和随机数进行比较得到每一个隐藏层节点的状态,然后通过公式求每一个可见层节点的概率值,再由求每一个隐藏层节点的概率值。最后参数梯度的计算公式变为:

 

其中,μ是学习率,datarecon分别表示训练数据的概率分布和重构后的概率分布。

通过以上方法都可以求出参数的梯度来,由每一个参数的梯度对原参数值进行修改来使模型的能量减小。

内容四(MovieLens数据集实验):

Movielens数据集:943个用户,1682部电影,100000条评分。

该数据有四列,第一列为评价序号,序号数最大为1000000,第二列代表用户的ID,第三列代表项目的ID,第四列代表用户对该项目的评价,通常来说,评价一般分为15五个等级,用户对物品的喜爱程度由小到大。

1,数据预处理

在该数据中按照百分比抽样,形成训练数据和测试数据。将数据形成一个943*1682的矩阵形式。

2,算法设计与实践

对于每一个用户的数据,分别建模,输入到模型中迭代调整权值,于是对于任意一个输入,我们需要将用户的打分数据形成softmax结构的输入,这里我们采用一个三维矩阵uatrainF(k,uraw,col)来记录softmax模型,其中K代表该列中的第Ksoftmaxurawcol分别代表原始矩阵的行和列,当数据进入模型时将uatrainF(k,uraw,col)的第二维(用户)抽取出来,输入模型算法,如下:

 

上图表示了一个可见层为softmax的两层波兹曼机模型的训练算法流程图,在初始化阶段,我们需要对模型的众多参数进行初始化,这些参数包括:权值学习速率、可见层偏好学习速率、隐含层偏好、权值代价因子、权值记忆因子、以及连接权值参数、可见层偏好、隐含层偏好,这些随机初始化的方法通常利用均匀分布随机数,或者标准正态分布随机数。进入迭代之后,进行正向推断和反向推断

对深度模型的建模工作,可利用上述两层波兹曼机的建方法,只是除了在第一层和第二层网络上与上述方法相同,第二层到顶层,隐含层神经元釆用的都是普通的{0,1}二值的神经元图的过程称为两层之间的预训练那么深度结构在相邻的两层之间都会有预训练的过程,由于我们的训练数据并没有标签数据,于是该模型不同于DBN—样存在着微调反馈这一阶段。模型算法流程图如图所示:

 

在预学习阶段,下一层隐含层的输出均作为上一层隐含层的输入。,将原来高维数据通过无监督学习在低维度重新表征出来。其中该网络的H1H2H3的维度分别为1000,500250,V1的维度即为输入矩阵的列数1628关于每一层神经元的个数的确定可参考上述链接指出,深层网络的中间层神经元较多时效果较好。接下来,对该低维数据重新进行相似度计算利用基于相似度计算的方法进行数据重构。

3实验结果评价方法

采用均方根误差(RMSE)来衡量真实评分数据和预测的评分数据的差距。

 

 

内容论文改进):

1MATLAB上运行,内存不够。

2,在Hadoop平台上的并行化。

深度学习分类网络

阅读数 15712