无欲则刚

无欲则刚 查看完整档案

潍坊编辑天津大学  |  智算 编辑  |  填写所在公司/组织填写个人主网站
编辑

微信公众号HR工作室,欢迎关注

个人动态

无欲则刚 收藏了文章 · 2020-12-26

提出智能扰动方法!字节跳动隐私保护论文入选 NeurIPS 2020 联邦学习 Workshop

字节跳动在隐私保护上的最新研究,有利于打消联邦学习上对标签数据安全的顾虑,进一步推动隐私计算的发展。

第三十四届神经信息处理系统大会(Conference and Workshop on Neural Information Processing Systems,以下将简称 NeurIPS 2020),于 2020 年 12 月中旬在线上举行。在本届会议上,字节跳动联邦学习隐私保护最新研究论文被 NeurIPS 2020 的联邦学习 Workshop 接收,并进行了线上分享。

NeurIPS 作为机器学习和计算神经科学领域的国际顶级会议,由 NeurIPS 基金会主办,每年固定在 12 月举行。NeurIPS 旨在促进有关神经信息处理系统的研究交流,在同行会议上介绍和讨论新颖的研究。在中国计算机学会的国际学术会议排名中,NeurIPS 为人工智能领域的A类会议 。

自欧盟 2018 年出台《通用数据保护条例》(GDPR)以及国内涉及数据隐私的法律法规逐步开始建立后,联邦学习逐渐成为保护数据隐私的一个利器。它可以在双方不公开各自隐私数据的情况下,实现机器学习模型的协同训练,因此受到了越来越多企业的关注,产生了很多落地应用。在这个背景下,NeurIPS 2020 设置了联邦学习的 Workshop,邀请全球联邦学习行业专家探讨联邦学习的扩展性、隐私性和安全性。

由于拥有海量的用户数据,字节跳动深知用户数据安全保护的重要性,为提升用户的信任度,寻求建立开放透明的平台,字节跳动一直在联邦学习领域持续投入资源进行研究和探索,先后在电商、金融、教育等多个行业场景进行了落地应用,并于 2020 年初开源了自研的联邦学习平台 Fedlearner(项目地址:https://github.com/bytedance/...)。

NeurIPS 2020 联邦学习 Workshop 上,字节跳动应用机器学习团队分享了在用户标签数据安全上的最新研究论文《Label Leakage and Protection in Two-party Split learning》。

字节跳动 x NeurIPS
《Label Leakage and Protection in Two-party Split learning》论文海报

论文分享了纵向联邦学习中隐私标签数据保护的新方案 —— 通过理论分析,对所添加的扰动进行约束优化,帮助联邦学习在效用和隐私间取得更好的平衡。具体则是对联邦学习过程中双方所交互的梯度进行分析,提出了一种基于梯度范数的推测标签信息的高效攻击方法,随后创新性地提出了在所交互的梯度上添加扰动的保护方法。

字节跳动应用机器学习团队研究员孙建凯称,大量的实验表明,在梯度范数攻击中,论文所提的标签数据保护算法,能够将标签泄露的 AUC 从接近于 1.0 (1.0 属于完全泄漏)降低至 0.5-0.6 之间(0.5 是属于完全保护),而模型的预测效果受到的影响相对较小。

孙建凯指出,虽然存在他们目前没有想到的其它攻击方法来窃取用户标签数据,但是通过论文中提到的方法,即使在面对未知的攻击方法时,也能最大程度保护标签数据,防止数据泄露。

由于联邦学习能够有效解决数据孤岛问题,让参与方在不共享数据的基础上联合建模,挖掘数据价值,因此国内外众多一线互联网公司纷纷投入研究和应用。标签作为价值很高的一类数据类型,吸引了众多行业人士不断思考和探索如何在联邦学习的框架下对其进行最大程度地保护。字节跳动在交互梯度上提出添加智能扰动的方法,则在一定程度上解决了标签数据安全性的问题,消除了大家的担忧,有利于进一步推动联邦学习应用,让数据发挥更大的价值。

为了让更多企业和开发者受益,目前字节跳动在隐私保护上的最新理论研究已经落地,相应算法(https://github.com/bytedance/...)已经合并到字节跳动开源的联邦学习框架Fedlearner中。

字节跳动联邦学习技术负责人吴迪在接受采访时表示 :“希望我们的最新研究,能为企业在应用联邦学习保护用户数据安全上提供更多的选择,同时也希望为联邦学习进一步规模化应用尽一份力,共同推动隐私计算的发展。”

segmentfault 思否

查看原文

无欲则刚 发布了文章 · 2020-10-16

springboot(1):简介

image.png

用Maven项目创建Spring应用

  1. 创建maven工程
  2. 在pom.xml中导入Spring Boot相关依赖
<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <!--SpringBoot版本-->
 <version>1.5.9.RELEASE</version>
</parent>


<dependencies>
 <dependency> <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency></dependencies>

3.编写主程序

package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class springHello {
    public static void main(String[] args){
        SpringApplication.run(springHello.class,args);
 }
}

4.编写相关的Controler、Service

package hello.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@org.springframework.stereotype.Controller
public class Controller {
    @ResponseBody
 @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
 }
}

5.测试启动main函数
6.部署
(1)首先把maven插件依赖写入pom.xml,这个maven插件可以把项目打包为jar包

<build>
 <plugins> <plugin> <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin> </plugins></build>

(2)maven-->声明周期-->package,得到jar包
image.png
(3)java -jar 项目名

总结:创建Maven项目-->导入父项目和用到模块的场景启动器-->写主程序-->写业务逻辑

Spring Boot原理

  • 流程:写主程序启动SpringBoot应用-->按照业务逻辑写Controller、Service,不再需要配置其他东西

为何SpringBoot不需要配置其他东西:分析pom.xml

  1. 点击pom.xml的父项目spring-boot-starter-parent,进入后点击父项目的父项目spring-boot-dependencies,发现里边定义了各种依赖的版本。即父父项目真正管理SpringBoot的所有依赖,是版本仲裁中心。所以我们导入依赖时默认不需要写版本(父父项目中没定义的除外)
  2. 导入依赖(场景启动器)。springboot将所有功能场景抽取出来,做成starter。我们需要啥功能,就导入相关的starter

用Spring项目创建springboot应用

  • 选择好导入的场景启动器后,父项目和场景启动器自动添加,主程序也有了。我们只要专心写业务逻辑就行了
  • 有三个文件是没用的,可以删除掉
  • resources中有三个文件夹

image.png

(1)static:保存所有的静态资源,如js、css、图片等
(2)templates:保存所有的模板页html。springboot默认的jar包使用嵌入式tomcat,不支持jsp页面,但我们可使用模板引擎(freemarker、thymeleaf)解决问题
(3)application.properities:springboot应用的配置文件,我们可以写他来修改默认设置

查看原文

赞 0 收藏 0 评论 0

无欲则刚 发布了文章 · 2020-08-18

机器学习(16):吴恩达笔记

最流行降维算法:主成分分析法(PCA)

  • 在应用PCA前,要先进行均值归一化和特征规范化,使得数值在可以比较的范围内
PCA目标
  • 当把数据集从二维降到一维时,要求我们找到一个向量,使得数据集每个点到向量所在直线的投影之间的距离尽可能小。即蓝色线段的长度,称为投影误差

image

  • 当从n维到k维时,就是找到k个向量,使得数据的投影误差最小
  • 总之,PCA的目标就是找到一个低维平面,将数据投影到低维平面上,然后最小化投影误差的平方,即每个点和投影到直线的点的距离
PCA和线性回归的关系
  • PCA和线性回归很相似,但不是线性回归。线性回归时,我们需要输出x预测y,要最小化点和平行y轴方向交点的平均平方误差;而PCA不用预测y,要最小化点到直线上投影的误差

image

PCA算法流程
  • 使用PCA前,有一个数据预处理的过程:先进行均值归一化,然后进行特征缩放。这两步和监督学习完全相同,先计算x的均值,然后用x-均值代替每个x(均值归一化);若变量的范围差距比较大(预测房价一个是大小一个是卧室数目),x-均值/s(表示x向量的度量范围,最大值-最小值)

image

  • 然后使用PCA设法找到一个低维子空间,使得数据投影到低维子空间的投影误差最小。总之,PCA要找到一种方法来计算出两个东西:(1)计算出低维空间的向量(2)计算出数据在低维空间的坐标

image

步骤

image

  • 首先计算出协方差方阵(注意协方差方阵的符号和求和符号类似,不要搞混了),并存入变量Sigma
  • 然后计算出Sigma矩阵的特征向量,使用【U,S,V】=svd(Sigma)命令实现(在matlab中svd和eig都能用来计算特征向量,只是svd更稳定;在其他编程环境中,我们只要找到一个能进行奇异值分解的函数库也可以实现)
  • 奇异值分解得到的U矩阵是一个nn矩阵,我们想从n维降到k维,就只要前k列,得到一个n k矩阵,我们记为U'reduce
  • 低维平面向量z=U'reduce的转置x,得到一个k 1的矩阵

image
当特征向量用矩阵表示时,直接可以通过下图计算得到sigma矩阵
image

反压缩

  • PCA作为压缩数据的算法,能把1000维降到100维;那么是否有算法能把压缩过的数据近似的还原到原始的高纬度数据呢
  • X'approx=U'reducez,得到n 1维向量,类似于将数据还原到二维平面的直线上,和原始数据非常接近了已经

image

怎样选择k

  • k是一个参数,称为主成分的数量。人们如何选择参数k,使得平均平方误差最小化呢
  • X(原始数据)-X'approx(映射数据)。我们想最小化x和投影点的平均平方误差,地位平面映射回去正好是投影点
  • 数据的总变差:样本长度平方的均值。我们选择能使平均平方误差/数据的总变差小于等于0.01的最小k值。选择了k,使得99%的差异性得以保留。还可以0.05、0.1、0.15

image

计算流程
  • 按照上边来看,我们要从k=1开始,算出每一个z,继而得到X'approx,带入公式看比值。若不满足k+1,重复上述步骤直到满足为止。这个过程的效率是相当低的
  • 前边使用svd命令得到的矩阵S是一个n*n方阵,主对角线非0,其余元素为0。对于给定的k,1-s的k求和/n求和小于等于0.01即可;即s/s大于0.99.这样我们只要调用一次svd即可,不需要重复计算X'approx

image

PCA的应用

  • 提高机器学习算法的速度。将10000维的向量降到1000维,加快计算速度。这时要注意,不仅仅训练集要降维为低维向量,测试集、交叉验证集都要降维为低维向量

image

  • 压缩数据,减少内存、磁盘的使用,来存储更多数据
  • 数据可视化。高维数据不好作图,降为二维或者三维好作图
错误应用
  • 过拟合。确实参数少了不容易过拟合,但是效果很差。因为pca不考虑标签,是在对标签y不知情的情况下,将某些信息舍弃掉了,里边难免有有效信息;过拟合拟合数据时则要率标签y。因此正则化才是最好的方式

image

查看原文

赞 0 收藏 0 评论 0

无欲则刚 发布了文章 · 2020-08-17

机器学习(13):吴恩达笔记

  • 前边我们已经学习了线性回归和逻辑回归、神经网络一系列监督学习算法,并且得出结论:在机器学习中,重要的不是使用算法a还是算法b,而是是否能收集到大量数据。并且算法的性能非常依赖使用者的个人水平,如特征向量的选择、正则化参数的选择
  • 接下来,我们讨论最后一个监督学习算法:支持向量机(SVM)。与逻辑回归和神经网络相比,SVM为学习复杂的非线性方程提供了一种更强大的方式

从逻辑回归讲起

  • 我们从逻辑回归开始,一点点的修改,逐渐改为实质上的支持向量机:

(1)首先考虑,我们要想逻辑回归干啥。当样本y=1时,假设函数h趋近1,即向量乘积远大于0;当样本y=0时,假设函数h趋近0,即向量乘积远小于0
image
(2)接着我们观察逻辑回归的代价函数只有一个样本即m=1时的样子。我们令y=1,得到如图曲线,这时想让代价函数小的话,要求z远大于0;我们将这条曲线修改为两条线段,右边水平,这作为支持向量机代价函数的一项。令y=0,得到如图曲线,想要代价函数小的话,要求z远小于0;我们继续用两条线段代替曲线,得到支持向量机的另一项。这两项定义为cost1(z)、cost0(z)
image

  • 下边我们开始构建支持向量机的代价函数:

(1)将逻辑回归代价函数的负号放到里边去,然后两个对数项替换成cost函数
(2)去掉1/m这一项。因为在一个样本集中,因为m是相同的,带不带对代价函数的大小比较没影响
(3)概念上的变化,不用正则化参数权衡平均误差和正则化项,而是用C参数权衡(实际是一样的,可以看做1/正则化参数)
经过三步加工,我们就得到了支持向量机的代价函数
image

  • 这里要注意逻辑回归和支持向量机的区别:

(1)逻辑回归输出的是概率,然后我们人为规定一个临界值,判断0还是1
(2)而支持向量机直接预测y是0还是1
image

支持向量机:又称大间距分类器

  • 支持向量机又称为大间距分类器,我们来看一下为什么。我们先考虑最小化支持向量机的代价函数要求什么:

(1)当y=1时,后边一项为0,只有z大于等于1时前边一项逼近0
(2)当y=0时,前边一项为0,只有z小于等于-1时后边一项逼近0

因此与逻辑回归仅要求正负或者自己定临界值不同,支持向量机要求更高,要求1和-1(个人理解:不是非黑即白了,在正负标签间有一段空白间距,有了过渡地带)。这就相当于嵌入了额外的安全因子,增大了准确性
image

  • 综前,要让误差项为0,就要满足这两个条件中的一个:

(1)y=1时,误差项大小由cost1决定,要求z大于1
(2)y=0时,误差项大小由cost0决定,要求z小于-1
image

  • 由于嵌入了安全因子,支持向量机的决策边界更加稳健。这是因为决策边界到训练样本有更大的最短距离。由于支持向量机的这个特性,有时又被称为大间距分类器

image

  • 若我们将C参数设置的非常大(100000),那么误差项的权重就会非常大,很有可能因为一个异常点就改变了曲线的形状,这显然是不明智的

image

大间距分类背后的数学原理

  • 下边我们看一下,为什么这种代价函数能够让决策边界到训练样本有更大的间距
复习向量的内积运算

U转置乘V=V乘U的转置=V投影到U上的投影,乘U的模(投影是有符号的)
image

应用内积到支持向量机的代价函数
  • 我们简化代价函数的参数0为0,只有两个特征,这使得我们能把它放到二维坐标中表示

(1)当满足前边误差项为0的条件之一时,代价函数只有正则化项一项,可以写作假设函数参数模的平方
(2)我们假设样本集只有一个样本,那么z可以写作参数向量的模乘特征向量在参数向量上的投影,将乘积和1或者-1比较
image
(3)因为参数0为0,所以决策边界通过原点。因为参数变量和决策边界是正交的,所以参数向量和距离是平行的。当最短距离小时,特征向量的投影值也小,要符合1、-1的话,要求参数向量的模大,而参数向量的模大的话,代价函数的值就会变大,这与我们尽量要求代价函数小矛盾。这就是支持向量机能产生大间距分类的原因
image

  • 综上,支持向量机通过尽可能缩小参数向量模的大小,来找到最大间距的决策边界

核函数

  • 在拟合非线性边界时,之前我们一般通过构造多项式特征变量解决,但是这种方法计算量太大。在支持向量机中,我们通过构造新的特征,来拟合非线性边界
    image
如何构造新的特征变量
  • 我们手动选择一些点,用函数度量x和每个点的相似度,这些相似度构成新的特征变量。其中,相似度函数就是核函数,核函数有许多种,这里我们以高斯核函数为例

image

  • 核函数的直观感受:当x和我们选择的点接近时,分子接近0,f接近1;当x和选择的点隔得远时,分子比较大,f接近0.所以核函数就是度量x和标记点的相似度,接近为1,远离为0。其中每个特征点l定义一个新的特征变量f

image

  • 核函数参数对核函数的影响:我们用等高线图表示。当核函数参数变小,变密收缩;核函数参数变大,稀疏扩展

image

  • 定义了新的特征变量后,看下新的假设函数:假设我们已经得到了假设参数。当训练样本接近l1点,f1接近1,f2、f3接近0,假设函数值为0.5,预测y=1;当训练样本远离时,f1、2、3都接近0,假设函数值为-0.5,预测y=0

image

查看原文

赞 0 收藏 0 评论 0

无欲则刚 发布了文章 · 2020-08-14

机器学习(12):吴恩达笔记

  • 这篇文章主要看下机器学习时要着重考虑的几个问题。我们以垃圾邮件分类为例,给定一些加了标签集的训练集,垃圾邮件y=1,非垃圾邮件y=0,通过监督学习构造分类器。

image
### 首先,考虑如何构造向量X

  • 在垃圾邮件分类中,我们可以给出一些区分垃圾和非垃圾邮件的单词,如deal、buy、discount是垃圾邮件常有的词,名字(Andrew)、now(表示比较急)是非垃圾邮件常有的词。我们选出这样的单词,有为1,没有为0,用特征向量表示
  • 上边的特征由我们手动选择,而在实际工作中,我们往往选出邮件中出现频率较多的词,作为特征向量

image

其次,我们考虑下使用哪种方法改进算法,来提高垃圾邮件分类器的准确度

  • 在直觉上,我们会先想到收集大量数据,但是这不一定有用
  • 除此外,我们也可以考虑使用更复杂的特征变量。

(1)因为垃圾邮件常常通过不常见的服务器发送,来源模糊,所以我们可以用邮件路径信息作为特征变量
(2)相同词义的不同词性作用相同,如discount=discounts、deal=dealer;大小写作用相同;垃圾邮件的标点符号有一定的特点(促销邮件使用大量!!!);垃圾邮件可能会用故意的拼写错误来避免被垃圾邮件特征单词筛出
image

### 误差分析:如何选择合适的改进算法的方法

  • 误差分析,指我们在构建机器学习程序时,最好不要先建立复杂的系统、构建复杂变量,而是先构建简单的算法来很快学习出模型来。尽管模型的效果可能不好,但我们可以找到误差产生的地方,来进一步决定是增大数据集还是使用复杂特征变量
  • 使用误差分析,是因为我们缺少学习曲线,不能提前知道是需要复杂变量还是更多数据,也就不知道把时间花在什么地方来提高效率。我们先构造简单的算法画出学习曲线,以此避免编程中的过早优化问题:我们必须用证据领导决策,而不是凭直觉,因为直觉往往是错误的
  • 误差分析的前提:虽然算法有简单和复杂之分,但是不同算法出现的错误一般是同样的,即一般都会把某些邮件错误的分类
  • 在垃圾邮件分类的例子中,我们学习到简单的模型,并交叉验证后。人工检查出现的错误,找出系统规律,看看哪一类的邮件总是被错误的分类,进而启发我们构造新的特征变量来提升算法
  • 我们发现错误分类的邮件中,卖药邮件12封、仿品邮件4封、钓鱼邮件53封、其余邮件31封。可以看出算法区分钓鱼邮件的表现很差,所以我们就多研究研究这方面,构造更好地特征变量区分钓鱼邮件
  • 我们看一下哪些方法能帮助我们更好地分类钓鱼邮件,检查拼写错误能检查出5封、检查不寻常的邮件路径来源能检查出16封、标点符号能检查出32封,看出标点符号是作用很强的特征,所以花费时间构造关于标点符号的特征复杂变量
    image
  • 综上,误差分析是一个手动监测的过程,来检测可能发生的错误

评估算法的数值计算方法

    • 在构造算法时,有一种数值计算的方式来评估机器学习算法是很有用的。
    • 在垃圾邮件分类的例子里,我们经过误差分析,考虑构造新的特征变量,将discount、discounts、discounts、discounting视为等同。在自然语言处理中,这可以通过porter等词干提取软件实现,软件通过检查开头几个字母是否相同,来判断是否视为等同
    • 但是检查开头几个字母得到的结果不一定正确,如universe、university就不一个意思。所以我们增加这个特征后,很难知道效果好不好
    • 所以我们通过交叉验证,看使用词干提取和不使用词干提取的错误率,看决定是否增加这个特征

    image

    • 总的来说,误差分析能帮助我们找到算法的劣势,启发我们提出改进方案;数值评估则负责评估改进方案是否提升了算法的效果。但是,数值评估需要有一个合适的误差度量值,有时候错误率作为误差度量值不合适,因此我们要找到合适的误差度量值

    偏斜类

    image

    • 在肿瘤分类的例子中,假设我们得到的模型用测试集检验只有1%正确率,从错误率角度看已经非常不错了。但是在测试集中只有0.5%的人得了癌症,那么1%的错误率就不那么友好了
    • 我们若假设y总是为0,即预测所有人都不得癌症,这时候错误率才0.5%,比1%的错误率更小,但这显然是不合适的。
    • 当一个类的样本数远多于另一个类的样本数,或者说当正样本和负样本的比例接近一个极端时,这种情况称为偏斜类。这时我们使y恒等于0或1时,错误率非常低,但是模型质量实际上很差。所以我们希望遇到偏斜类时,能使用另外的误差度量值评估算法,即召回率和查准率
    查准率和召回率

    image

    • 先看下这四个定义:

    (1)真阳性:实际上y=1,预测y=1
    (2)真阴性:实际上y=0,预测y=0
    (3)假阳性:实际y=0,预测y=1
    (4)假阴性:实际上y=1,预测y=0

    可以看出,真假是对预测值是否正确而言,阴阳是对预测值而言

    • 有了上边四个定义,我们就可以引入查准率和召回率了

    (1)查准率:对于所有预测患有癌症的病人,实际上真正患有癌症的病人占的比例。高查准率表明对于病人,我们预测他们得了癌症具有很高的准确率
    (2)召回率:所有实际上患有癌症的病人,我们能预测出来的比例。

    通过这两个,我们可以判断对于偏斜类的分类模型到底好不好。值得注意的是,这里查准率和召回率的阳性定义为y=1,这并不绝对,一般那个出现的比较少,我们就把那个定义为阳性

    • 查准率和召回率能够较好的解决偏斜类问题。当我们总是预测y=0,级没有人患癌症,就没有真阳性,召回率为0
    查准率和召回率的权衡

    image

    • 在癌症预测的例子中,我们用逻辑回归模型训练数据,输出在0~1间的概率值。并且一般情况下,当h函数大于等于0.5时预测为1
    • 但是,我们希望能在非常确信的情况下,才预测一个人得了癌症。因为告诉病人他得了癌症意味着非常坏的消息,他会经历一段非常痛苦的治疗过程。
    • 所以,我们修改算法,把临界值设为0.7,即只有在概率比较高的情况下才预测病人得了癌症。这样,我们预测的癌症病人中,非常大概率真正患有癌症,这样就有高查准率、低召回率
    • 但是,另一方面,我们又希望能避免遗漏掉患有癌症的病人,即避免假阴性的出现。所以我们将概率设的低一点(0.3),这样真正患有癌症的人就能大部分被标记出来,但是预测的人中有很大部分并没有患癌症。这会导致低查准率、高召回率
    • 综上,查准率和召回率两者不可兼得,我们需要权衡,看看更看重哪一个
    如何使用查准率和召回率比较模型好坏
    • 前边我们使用错误率作为评估度量值时,只需要比较一个实数;而这里我们有两个数需要比较,如何确定一个评价标准,即怎么知道是0.5、0.4好,还是0.7、0.1好呢?
    • 首先,我们提出了计算查准率和召回率的平均值。但是这样有局限性,如我们总预测y=0,会得到接近0的召回率和接近1的查准率,这样可能取平均值还是比较高。所以取平均值不是评估算法的好办法
    • 因此我们用F值评估。F值也考虑了平均值,但是会给较低的值更大的权重。从分子可以看出来,分子是乘积,所以一个是0整个就是0。F值返回一个0~1的数值

    image

    • 我们可以试一试不同的临界值,然后在交叉验证集上做测试,看看那个F值最高

    数据量的重要性

    • 前边我们讨论了模型的评价指标,下边我们来看下数据量的重要性
    • 之前,人们做了一个研究。来比较不同算法的效果,以及这些算法用到不同训练集大小上的效果。问题是如何在易混淆的词间进行分类(to、two、too),人们使用了方差、winnow算法、基于内存的学习算法、朴素算法四种算法,并改变数据量大小,进行了实验。

    image

    • 结论:无论算法好坏,大部分算法的性能都是类似的,但是随着训练数据量的增大,算法性能逐渐增强。因此,数据量是非常重要的,一个劣等的算法如果数据量远大于优等算法的话,可能会取得更好的效果
    • 普遍共识:最好的不是拥有最好算法的,而是拥有最多数据的。
    • 但是数据量的重要性有一个前提,就是特征集x能包含足够多的信息来预测y。例如在单词分类中,空白周围的词语给了足够的信息;而在房价预测中,如果我们只给大小,没有位置、装修、卧室数量的话,就很难预测价格
    • 我们可以这样看特征是否提供了足够的信息,如果把句子给英语专家看,能预测出来;但是只给售楼小姐看大小,预测不出房价

    image

    • 综上,得到高性能算法的关键:

    (1)特征值包含足够多的信息能够预测y
    (2)具有大量的训练数据。训练数据过大,大于特征数量,可以避免过拟合,使训练误差接近测试误差
    (3)使用很多参数的学习算法,如多特征线性回归和逻辑回归、有很多隐藏单元的神经元。多参数可以拟合非常复杂的参数,减小训练误差
    image

    查看原文

    赞 0 收藏 0 评论 0

    无欲则刚 发布了文章 · 2020-08-11

    机器学习(10):吴恩达笔记

    image

    • 当机器学习得到的模型有较大误差时,从哪个方面入手修改。以预测房价为例,我们已经完成了正则化线性回归并得到了参数向量,但当我们放到新的样本集中进行测试时发现产生了巨大的误差,此时我们有以下几种改进方法:

    (1)使用更多的训练样本。
    (2)选用更少的特征集,只选用特征集的子集
    (3)加入其他的特征(当前特征不是很有效)
    (4)增加高阶的多项式特征
    (5)增大或减小正则化参数,避免过拟合或者欠拟合

    好多人在改进模型时,会随便选一种方法,画上几个月研究,最后却走上了一条不归路。这是因为改进方法不应该是凭感觉随便选的,下边我们就来探讨下如何判断用哪种方法改进算法

    • 下边我们引入学习诊断法,即先测试某种算法是否有用,若算法没用再判断要改进算法效果需要尝试哪种方法

    新的假设函数评估方法

    • 在前边,我们选择令训练误差最小化的参数,来确定假设函数的参数。但是这样做,只能确定参数在旧的数据(训练集)中的误差,无法判定参数是否具有很好地泛化能力(能否应用到新的数据当中)
    • 因此,我们采用一种新的假设函数泛化能力的评估方法,将数据集分为两部分:训练集和测试集。通常典型的分割方式是7:3;而且要注意随机选择70%作为训练集(当然数据充分的随机分布的话,按顺序选前70%也无所谓)

    (1)在线性回归中,我们首先通过最小化训练集的误差,得到学习参数,然后把训练得到的参数放到测试集中,用平方误差法计算测试误差
    image
    (2)在逻辑回归(分类问题)中类似。只是我们计算误差时采用0~1假设函数:当预判y>0.5时实际y=0、当y<0.5时实际y=1,函数得1;当预判和实际相符时得0
    image

    • 若评估得到的测试集误差太大,要重新学习模型

    模型选择问题

    • 如何确定假设函数最合适的多项式次数,怎样选用正确的特征构造学习算法,怎样选择合适的正则化参数,这就是模型选择问题
    • 我们可以将数据分为三组:训练集、验证集、测试集,来解决模型选择问题

    如何选择合适的多项式次数

    • 重温过拟合:把参数调整到非常拟合训练集,保证了在训练集上拟合的很好,但是不能保证训练集外的新样本预测结果如何
    • 为了选择合适的多项式次数,我们引入一个新的多项式次数参数d。当我们把数据只分为两部分时,看一下思路:

    (1)对d不同的每个模型最小化训练误差,得到假设函数的参数向量
    (2)对每个假设函数求测试集误差,选出测试集误差最小(最拟合测试集的),这个模型的多项式参数d就是我们要的
    image

    • 但是这样做,还是不能说明我的假设能推广到一般结果(泛化性)。我们评价假设函数的参数也用测试集,找多项式次数参数d也用测试集。也就是说,我们本来就是用测试集拟合的假设函数,这时再用测试集看测试误差一般就比较小。即结果可能很好地拟合测试集,但是对新的样本就不知道了
    • 为了解决这个问题,我们进一步将数据分为了三部分:训练集、验证集(交叉验证集)、测试集,比例大致是6:2:2

    image

    并定义了训练误差、交叉验证误差、测试误差
    image

    • 与传统的用测试集同时评估假设函数参数、找多项式参数d不同。我们使用交叉验证集选择多项式参数d,使用测试集评估假设函数的参数

    image

    我们先使训练误差最小化,得到假设函数的参数向量;然后在交叉测试集计算不同多项式参数d对应模型的误差,选择误差最小的多项式参数d;最后使用测试集来评估所选模型的假设函数的泛化误差。

    • 值得一提的是,尽管前边只分数据集和测试集的方法已经过时了,但是由于它在样本量较大的时候准确性还可以,所以还有许多人这样做

    算法不理想的原因

    • 若算法不理想,可能有两种原因:方差比较大或者偏差比较大,即过拟合或者欠拟合。判断算法是偏差还是方差有问题,对于改进算法效果非常重要

    image

    • 如图,两条曲线表示训练集误差和验证集误差(平方误差),横坐标表示多项式参数d。联系欠拟合和过拟合,当多项式次数d增大时,训练集误差减小,甚至可能到0;而交叉验证集误差先变小后变大(假设5次是最合适的)。

    image

    • 当我们得到的模型交叉验证误差和训练误差都很大,如何判断是高方差还是高偏差?

    (1)上图左端是高偏差:模型使用了过小的多项式次数(d)。高偏差对应欠拟合,两个误差都很大,很接近(连训练集都拟合得不好)
    (2)右端是高方差:模型使用了较大的多项式次数(d)。高方差对应过拟合,训练误差小,验证集误差大,两个误差的差距比较大

    正则化和偏差方差的关系

    • 算法正则化可以防止过拟合,正则化过度又会导致欠拟合。而偏差和方差与欠拟合和过拟合关系密切,我们来探讨下方差偏差和欠拟合间的关系
    • 我们通过正则化项让参数尽可能小(不惩罚参数0)。

    (1)若正则参数非常大(如1000),参数被大大惩罚,参数值接近0,成了一条水平直线,这就是高偏差、欠拟合
    (2)若正则化参数太小(接近0),参数惩罚不够,过度追求拟合训练集数据,就成了过拟合、高方差

    怎样自动选择出合理的正则化参数

    image
    image

    • 首先,我们重新定义下代价函数j。在一般的代价函数中,误差定义为训练集数据和模型预测值的平均平方求和,再加上一个正则化项。在这里,我们将(训练误差应该还有正则化项吧)验证误差和测试误差都定义为平均误差平方和,不再含有正则化项
    • 自动选取正则化参数的方法:

    (1)选取不正则化的情况(正则化参数为0),以及一些我想要尝试的正则化参数值。如这里我选取0.01,0.02,...,10.24,将步长设置为两倍增长。这样一共有13个模型。
    (2)对每个模型最小化代价函数(带正则化项的代价函数),得到对应的参数向量
    (3)然后用交叉验证集评估得到的假设函数(不带正则化项),选出平均平方误差最小的,测试该模型在训练集上的平均误差平方

    本质上,仍然使用交叉验证误差计算不同正则化参数对新样本的拟合能力,用测试集评估模型的泛化能力

    • 上边要着重理解下为啥有时候带正则化项,有时候不带正则化项。求参数向量时,需要正则化项惩罚参数,所以带;后边都是进行评估,所以不带
    • 下边看一下,改变正则化参数的值后,交叉验证误差和训练集误差(都不带正则化项)的变化情况。正则化参数过小,惩罚力度不够,训练集误差小,验证集误差大,高方差、过拟合;正则化参数过大,成了水平直线,训练集、验证集误差都大,高偏差、欠拟合

    学习曲线

    • 结合前边学的所有概念,我们建立模型诊断法:学习曲线。来诊断学习算法处于偏差还是方差问题,还是两者都有

    image

    • 我们来看一下,当我们改变正则化参数时,交叉验证误差和训练集误差发生怎样的变化。这里值得注意的是,代价函数原本包含正则化项,但是在这里训练误差和交叉验证误差定义为不包含正则化项。
    • 上图可见,当正则化参数小时,惩罚力度不够,曲线千方百计拟合训练集,训练集误差小,验证集误差大,为过拟合、高方差;当正则化参数大时,惩罚过大,变成水平直线,训练集、验证集误差都变大,为欠拟合、高偏差
    学习曲线
    • 学习曲线可以帮助观察算法是否处于偏差、方差状态,从而进一步改进算法效果
    • 在画学习曲线前,我们先来了解下训练集、验证集的平均误差平方和随样本总数m的变化。

    image

    (1)当m很小时,我们能够很容易的拟合到每一个数据,训练集误差为0;当m变大时,我们要拟合到每一个数据就越发困难,平均训练误差逐渐增大
    (2)对于交叉验证误差而言,当样本数量m小时,模型的泛化程度必定不会太好,交叉验证误差变大;随着数据量增多,泛化表现越来越好,交叉验证误差变小

    当处于高偏差或者高方差时,学习曲线是什么样子

    image

    • 当处于高偏差、欠拟合时,例如我们用一条直线拟合模型。当样本数量逐渐变大时,函数泛化能力增强,但由于直线不可能很好地拟合,所以交叉验证误差变小,但是逐渐水平;而只有一个样本时,很好拟合,此时训练机误差很小,随着m增大不好拟合,训练集误差变大,接近交叉验证误差。

    总之,高偏差时交叉验证、训练误差都很大;而且当我们持续增大样本数量m时,交叉验证误差逐渐变为水平不再降低。因此看清楚算法处于高偏差时很有意义的,他可以避免我们浪费时间去找更多数据(高偏差收集更多数据对于提高模型泛化能力没有意义)
    image

    • 当处于高方差、过拟合时,当样本数量m较小时,会拟合的非常好,训练误差很小;当m增大,由于数量多毕竟拟合吃力,所以训练误差逐渐变大,但还是很小。而交叉验证误差很大,即便通过增大样本数目提高模型泛化能力有一定的下降,但是仍然维持在较大的水平。

    总之,在高方差中,增大样本数量对于提高算法效果是有帮助的。看清楚处于高方差也有意义,能帮助我们决定是否有必要增加更多样本数据

    • 当我们发现算法没有达到预期的效果时,通常就是画出学习曲线,看是偏差还是方差的问题,进一步判断哪些方法是有效的,哪些方法是徒劳的

    image
    (1)使用更多的训练集数据,对于高方差有帮助,对高偏差没有意义。
    (2)少选几种特征,对高方差有效,对高偏差没有意义(少选特征就相当于减少了自变量的数量嘛,曲线就不复杂了,进而不会过拟合)
    (3)选用更多的特征,对于高偏差有效,对于高方差无效(相当于增加自变量,函数更加复杂)
    (4)增加多项式次数,对于高偏差有效,对于高方差无效
    (5)增大正则化参数可以修正高方差,减小正则化参数可以修正高偏差

    前边内容与神经网络的联系

    image

    • 一般来说,隐藏单元少、只有一层的神经网络比较简单,因为神经元比较少,参数会比较少,而且计算量比较小,但是容易出现过拟合

    相反的,隐藏单元多或者隐藏层多的神经网络比较复杂,由于神经元多,参数也多,而且计算量大,容易出现过拟合

    • 但是参数多、计算量大不是我们考虑的主要问题,而且过拟合可以通过正则化解决。因此,使用大型神经网络并采用正则化解决过拟合,比用小型神经网络效果更好
    • 在选择隐藏层数时,一般默认选择一个隐藏层
    查看原文

    赞 0 收藏 0 评论 0

    无欲则刚 发布了文章 · 2020-08-11

    机器学习(10):吴恩达笔记

    image

    • 当机器学习得到的模型有较大误差时,从哪个方面入手修改。以预测房价为例,我们已经完成了正则化线性回归并得到了参数向量,但当我们放到新的样本集中进行测试时发现产生了巨大的误差,此时我们有以下几种改进方法:

    (1)使用更多的训练样本。
    (2)选用更少的特征集,只选用特征集的子集
    (3)加入其他的特征(当前特征不是很有效)
    (4)增加高阶的多项式特征
    (5)增大或减小正则化参数,避免过拟合或者欠拟合

    好多人在改进模型时,会随便选一种方法,画上几个月研究,最后却走上了一条不归路。这是因为改进方法不应该是凭感觉随便选的,下边我们就来探讨下如何判断用哪种方法改进算法

    • 下边我们引入学习诊断法,即先测试某种算法是否有用,若算法没用再判断要改进算法效果需要尝试哪种方法

    新的假设函数评估方法

    • 在前边,我们选择令训练误差最小化的参数,来确定假设函数的参数。但是这样做,只能确定参数在旧的数据(训练集)中的误差,无法判定参数是否具有很好地泛化能力(能否应用到新的数据当中)
    • 因此,我们采用一种新的假设函数泛化能力的评估方法,将数据集分为两部分:训练集和测试集。通常典型的分割方式是7:3;而且要注意随机选择70%作为训练集(当然数据充分的随机分布的话,按顺序选前70%也无所谓)

    (1)在线性回归中,我们首先通过最小化训练集的误差,得到学习参数,然后把训练得到的参数放到测试集中,用平方误差法计算测试误差
    image
    (2)在逻辑回归(分类问题)中类似。只是我们计算误差时采用0~1假设函数:当预判y>0.5时实际y=0、当y<0.5时实际y=1,函数得1;当预判和实际相符时得0
    image

    • 若评估得到的测试集误差太大,要重新学习模型

    模型选择问题

    • 如何确定假设函数最合适的多项式次数,怎样选用正确的特征构造学习算法,怎样选择合适的正则化参数,这就是模型选择问题
    • 我们可以将数据分为三组:训练集、验证集、测试集,来解决模型选择问题

    如何选择合适的多项式次数

    • 重温过拟合:把参数调整到非常拟合训练集,保证了在训练集上拟合的很好,但是不能保证训练集外的新样本预测结果如何
    • 为了选择合适的多项式次数,我们引入一个新的多项式次数参数d。当我们把数据只分为两部分时,看一下思路:

    (1)对d不同的每个模型最小化训练误差,得到假设函数的参数向量
    (2)对每个假设函数求测试集误差,选出测试集误差最小(最拟合测试集的),这个模型的多项式参数d就是我们要的
    image

    • 但是这样做,还是不能说明我的假设能推广到一般结果(泛化性)。我们评价假设函数的参数也用测试集,找多项式次数参数d也用测试集。也就是说,我们本来就是用测试集拟合的假设函数,这时再用测试集看测试误差一般就比较小。即结果可能很好地拟合测试集,但是对新的样本就不知道了
    • 为了解决这个问题,我们进一步将数据分为了三部分:训练集、验证集(交叉验证集)、测试集,比例大致是6:2:2

    image

    并定义了训练误差、交叉验证误差、测试误差
    image

    • 与传统的用测试集同时评估假设函数参数、找多项式参数d不同。我们使用交叉验证集选择多项式参数d,使用测试集评估假设函数的参数

    image

    我们先使训练误差最小化,得到假设函数的参数向量;然后在交叉测试集计算不同多项式参数d对应模型的误差,选择误差最小的多项式参数d;最后使用测试集来评估所选模型的假设函数的泛化误差。

    • 值得一提的是,尽管前边只分数据集和测试集的方法已经过时了,但是由于它在样本量较大的时候准确性还可以,所以还有许多人这样做

    算法不理想的原因

    • 若算法不理想,可能有两种原因:方差比较大或者偏差比较大,即过拟合或者欠拟合。判断算法是偏差还是方差有问题,对于改进算法效果非常重要

    image

    • 如图,两条曲线表示训练集误差和验证集误差(平方误差),横坐标表示多项式参数d。联系欠拟合和过拟合,当多项式次数d增大时,训练集误差减小,甚至可能到0;而交叉验证集误差先变小后变大(假设5次是最合适的)。

    image

    • 当我们得到的模型交叉验证误差和训练误差都很大,如何判断是高方差还是高偏差?

    (1)上图左端是高偏差:模型使用了过小的多项式次数(d)。高偏差对应欠拟合,两个误差都很大,很接近(连训练集都拟合得不好)
    (2)右端是高方差:模型使用了较大的多项式次数(d)。高方差对应过拟合,训练误差小,验证集误差大,两个误差的差距比较大

    正则化和偏差方差的关系

    • 算法正则化可以防止过拟合,正则化过度又会导致欠拟合。而偏差和方差与欠拟合和过拟合关系密切,我们来探讨下方差偏差和欠拟合间的关系
    • 我们通过正则化项让参数尽可能小(不惩罚参数0)。

    (1)若正则参数非常大(如1000),参数被大大惩罚,参数值接近0,成了一条水平直线,这就是高偏差、欠拟合
    (2)若正则化参数太小(接近0),参数惩罚不够,过度追求拟合训练集数据,就成了过拟合、高方差

    怎样自动选择出合理的正则化参数

    image
    image

    • 首先,我们重新定义下代价函数j。在一般的代价函数中,误差定义为训练集数据和模型预测值的平均平方求和,再加上一个正则化项。在这里,我们将(训练误差应该还有正则化项吧)验证误差和测试误差都定义为平均误差平方和,不再含有正则化项
    • 自动选取正则化参数的方法:

    (1)选取不正则化的情况(正则化参数为0),以及一些我想要尝试的正则化参数值。如这里我选取0.01,0.02,...,10.24,将步长设置为两倍增长。这样一共有13个模型。
    (2)对每个模型最小化代价函数(带正则化项的代价函数),得到对应的参数向量
    (3)然后用交叉验证集评估得到的假设函数(不带正则化项),选出平均平方误差最小的,测试该模型在训练集上的平均误差平方

    本质上,仍然使用交叉验证误差计算不同正则化参数对新样本的拟合能力,用测试集评估模型的泛化能力

    • 上边要着重理解下为啥有时候带正则化项,有时候不带正则化项。求参数向量时,需要正则化项惩罚参数,所以带;后边都是进行评估,所以不带
    • 下边看一下,改变正则化参数的值后,交叉验证误差和训练集误差(都不带正则化项)的变化情况。正则化参数过小,惩罚力度不够,训练集误差小,验证集误差大,高方差、过拟合;正则化参数过大,成了水平直线,训练集、验证集误差都大,高偏差、欠拟合

    学习曲线

    • 结合前边学的所有概念,我们建立模型诊断法:学习曲线。来诊断学习算法处于偏差还是方差问题,还是两者都有

    image

    • 我们来看一下,当我们改变正则化参数时,交叉验证误差和训练集误差发生怎样的变化。这里值得注意的是,代价函数原本包含正则化项,但是在这里训练误差和交叉验证误差定义为不包含正则化项。
    • 上图可见,当正则化参数小时,惩罚力度不够,曲线千方百计拟合训练集,训练集误差小,验证集误差大,为过拟合、高方差;当正则化参数大时,惩罚过大,变成水平直线,训练集、验证集误差都变大,为欠拟合、高偏差
    学习曲线
    • 学习曲线可以帮助观察算法是否处于偏差、方差状态,从而进一步改进算法效果
    • 在画学习曲线前,我们先来了解下训练集、验证集的平均误差平方和随样本总数m的变化。

    image

    (1)当m很小时,我们能够很容易的拟合到每一个数据,训练集误差为0;当m变大时,我们要拟合到每一个数据就越发困难,平均训练误差逐渐增大
    (2)对于交叉验证误差而言,当样本数量m小时,模型的泛化程度必定不会太好,交叉验证误差变大;随着数据量增多,泛化表现越来越好,交叉验证误差变小

    当处于高偏差或者高方差时,学习曲线是什么样子

    image

    • 当处于高偏差、欠拟合时,例如我们用一条直线拟合模型。当样本数量逐渐变大时,函数泛化能力增强,但由于直线不可能很好地拟合,所以交叉验证误差变小,但是逐渐水平;而只有一个样本时,很好拟合,此时训练机误差很小,随着m增大不好拟合,训练集误差变大,接近交叉验证误差。

    总之,高偏差时交叉验证、训练误差都很大;而且当我们持续增大样本数量m时,交叉验证误差逐渐变为水平不再降低。因此看清楚算法处于高偏差时很有意义的,他可以避免我们浪费时间去找更多数据(高偏差收集更多数据对于提高模型泛化能力没有意义)
    image

    • 当处于高方差、过拟合时,当样本数量m较小时,会拟合的非常好,训练误差很小;当m增大,由于数量多毕竟拟合吃力,所以训练误差逐渐变大,但还是很小。而交叉验证误差很大,即便通过增大样本数目提高模型泛化能力有一定的下降,但是仍然维持在较大的水平。

    总之,在高方差中,增大样本数量对于提高算法效果是有帮助的。看清楚处于高方差也有意义,能帮助我们决定是否有必要增加更多样本数据

    • 当我们发现算法没有达到预期的效果时,通常就是画出学习曲线,看是偏差还是方差的问题,进一步判断哪些方法是有效的,哪些方法是徒劳的

    image
    (1)使用更多的训练集数据,对于高方差有帮助,对高偏差没有意义。
    (2)少选几种特征,对高方差有效,对高偏差没有意义(少选特征就相当于减少了自变量的数量嘛,曲线就不复杂了,进而不会过拟合)
    (3)选用更多的特征,对于高偏差有效,对于高方差无效(相当于增加自变量,函数更加复杂)
    (4)增加多项式次数,对于高偏差有效,对于高方差无效
    (5)增大正则化参数可以修正高方差,减小正则化参数可以修正高偏差

    前边内容与神经网络的联系

    image

    • 一般来说,隐藏单元少、只有一层的神经网络比较简单,因为神经元比较少,参数会比较少,而且计算量比较小,但是容易出现过拟合

    相反的,隐藏单元多或者隐藏层多的神经网络比较复杂,由于神经元多,参数也多,而且计算量大,容易出现过拟合

    • 但是参数多、计算量大不是我们考虑的主要问题,而且过拟合可以通过正则化解决。因此,使用大型神经网络并采用正则化解决过拟合,比用小型神经网络效果更好
    • 在选择隐藏层数时,一般默认选择一个隐藏层
    查看原文

    赞 0 收藏 0 评论 0

    无欲则刚 发布了文章 · 2020-08-08

    机器学习(8):吴恩达笔记

    通过异或学习例子理解神经网络如何计算复杂的非线性函数

    异或

    image

    • 为了学习异或这个显然是非线性判别边界的例子,我们先看一些简单的线性判别边界例子
    逻辑与(&&)

    image

    逻辑或(||)

    image

    逻辑非

    image

    异或的实现

    image

    • 通过这个例子我们会发现,神经网络能够让我们得到更加复杂的函数。且层数越多,能得到的函数就越复杂

    如何用神经网络做多类别分类

    • 多类别分类应用范围比较广,像手写数字识别就属于多分类(0~9共分10个类别)。我们用神经网络解决多分类问题时,运用了逻辑回归的多分类的一对多思想
    例子
    • 现在我们要识别图片是人、汽车、摩托车还是大车,这就是一个多分类问题。
    • 当二分类问题时,我们只要建立一个输出单元,输出0或者1的实数;当多分类问题时,我们则建立四个输出单元,并且输出值从实数变成了四维向量。这里就运用了逻辑回归的一对多思想,把一类作为1,其余的看做一类都作为0.

    image

    image

    代价函数的给出

    image

    • 神经网络的代价函数和逻辑回归的代价函数类似。我们先给出逻辑回归的代价函数,这里要注意的是,正则化项不含参数0.
    • 接着,我们看一下神经网络的代价函数。与逻辑回归不同在于,逻辑回归仅仅是一个输出单元,而神经网络则是k个输出单元的求和,即输出层所有单元的求和。而尽管神经网络的正则化项很复杂,但实际上就是把除了每一层的参数0外的所有参数项加起来。(这里参数0加进去也无所谓,只是出于习惯我们一般不加)

    用反向传播算法优化代价函数

    • 在给出代价函数之后,我们要设法找到参数,使代价函数取得最小值。在找到参数最小化代价函数的过程中,我们通常使用梯度下降算法或者其他的高级优化算法。这些算法往往都需要参数的偏导数项,因此,最小化代价函数的关键,在于如何计算出各个参数的偏导数项。

    image

    从只有一个训练样本说起
    • 首先,我们令整个训练集只包含一个训练样本,我们先使用前向传播算法,看一下当我们给定输出的时候,假设函数输出的结果

    image

    • 下边我们来看一下,如何使用反向传播算法计算偏导数项:

    image
    我们要添加theta这个误差参数项,表示第l层第j个单元的误差。接下来我们看一下如何计算theta这个误差参数项。
    (1)输出层:a4(假设函数的输出)-训练集的y值
    (2)前边误差项的计算:前边的层和后边一层的参数矩阵的转置矩阵*后边一层的误差参数矩阵,再点乘一个导数项。这个导数项实际上=a3乘(1-a3)
    (3)第一层没有误差参数,因为第一层输入的是训练集样本,不可能有误差

    • 从上边的过程,我们就可以看出反向传播名字的由来:从输出层开始计算参数误差,往前一层层的返回,一直计算到第二层
    • 在通过反向传播算法得到误差参数后,我们就可以利用误差参数积累得到偏导数项了。通过for循环积累偏导数项,分参数为0和不为0两种情况讨论。在计算得到偏导数项后,就可以用在梯度下降法中了

    image

    • 综上,反向传播就是先由输出层反向直到第二层,计算得到每层的误差参数。然后利用误差参数积累偏导数项
    查看原文

    赞 0 收藏 0 评论 0

    无欲则刚 发布了文章 · 2020-08-08

    机器学习(7):吴恩达笔记

    为何要研究神经网络算法

    • 神经网络是一种古老的算法,但是又是许多机器学习的首选技术。
    • 我们已经有线性回归和逻辑回归算法了,为啥还要研究神经网络算法呢?

    image
    我们来看下包含足够多非线性项的逻辑回归问题。对于复杂的机器学习问题,会含有上百个特征,就算我们只看二次项,也会有非常多的项数;如果拓展到三次项,就更甭提了。这时计算是非常复杂的
    image

    接下来我们看一下计算机视觉问题。加入我们想通过机器学习训练分类器,看图像是不是汽车。在计算机看来,它看车门把手,实际上看到的是包含像素点亮度的数据矩阵,不能像人类那样直接看出门把手来。

    所以我们先提供两类图片,一类是各种图片,一类是其他东西,让计算机进行学习后,再输入图片,让他判定图片是不是汽车

    image
    image
    这里要处理的数据也是非常多的,假设只有50*50个像素点,那么特征向量要包含所有像素点的亮度,也有2500维;要是用rgb三原色表示的话,就成了7500维。如果我们仍然想通过包含所有二次项或者三次项的假设函数解决问题的话,样本数据太大,计算成本太高(理解:神经网络就是把原始特征转化成了更高级更抽象的特征)

    • 为了解决这些数据量非常大(假设函数的参数非常多)的非线性回归,我们引入了神经网络

    神经网络的来生前世

    • 人们想设计出模仿人类大脑的算法。开始,人们以为模仿似乎要写上千个程序来做五花八门的事情(看、听、触觉);但是后来人们发现,大脑做那么多事情似乎只需要一个单一的算法。尽管这只是一种假设,但是目前有相关的证据:

    imageimage
    (1)神经重接实验。听觉皮层依靠耳朵接受信号,传递到听觉皮层,做出反应。神经学家将耳朵和听觉皮层的神经切断,而将眼睛连到听觉皮层上,发现能看到东西。

    这表明,人类的脑组织能处理光、声、触觉等多种信号。所以我们假设,存在一种算法,能同时处理这些信号,而不是运行各种不同的程序

    神经网络模型的表示

    • 我们先看单个神经元:

    image
    单个神经元包含三部分,胞体负责计算,输入神经接受其他神经元的信息,输出神经则负责给其他神经元传递信号。神经元的工作就是,接受其他神经元信息,做一些计算,然后将结果传送到其他节点

    • 接着我们用一个简单的模型模拟神经元:

    image
    黄圈类似神经元,通过接受参数,计算输出一个类似逻辑回归的函数。值得注意的是,每层的神经网络都有一个偏置参数0,这个参数恒为1,可以画出来也可以不画出来;这个类似逻辑回归函数的函数称为激励函数,它与逻辑回归函数完全相同

    • 下边来看神经网络:

    image
    神经网络就是许多神经元组合在一起的集合。例如上图,有三个输入单元(每一层的参数0不算),一个隐藏层,隐藏层含有三个隐藏节点,一个输出节点。第一层称为输入层,输入特征;最后一层称为输出层,输出神经网络的最终计算结果。隐藏层可能有多个,我们称为隐藏层,是因为我们在最终的输入输出中,看不到隐藏层的输入输出(不是x不是y)

    • 神经网络的计算过程:

    image
    (1)a表示激励,即一个神经元读入数据经过计算后,输出的值。a的上标j表示第j层,a的下标i表示第i个神经元
    (2)神经网络每一层的参数通过矩阵表示,即参数矩阵表示从一层到另外一层的作用。如我们有三个输入单元,三个隐藏单元,那么参数矩阵就是(3+1)*3维的矩阵.这些参数又称为权重
    (3)g激励函数,与逻辑回归函数完全相同,将参数范围固定在0~1间

    如何高效计算,用向量化方法实现神经网络模型

    前向传播算法:从输入层到最后一层计算出输出层的激励

    image

    • 神经网络模型先在输入层输入特征,然后一层层的计算隐藏单元的激励值,最后得到假设函数的输出。每个神经元的激励值,都是上一层的激励值(第一层则是特征值)和参数两两相乘,然后外边套一个激励函数得到
    • 将过程向量化:

    (1)将输入层用n*1矩阵表示(不要忘了恒为1的参数0),与输入层到隐藏层的参数矩阵相乘,外边套上激励函数得到隐藏层三个单元的激励值;
    (2)然后加入参数0,将隐藏层用矩阵表示,与隐藏层到输出层的参数矩阵相乘,外边套上激励函数得到输出值

    • 对比逻辑回归:

    我们可以看出,前向传播算法(从隐藏层到输出层)的过程和逻辑回归算法很相似。只是逻辑回归输入输出层的值是原始特征,而前向传播算法则是经过训练学习的更抽象的特征。这也进一步印证了神经网络将特征由原始向抽象、高级加工的过程
    image

    查看原文

    赞 0 收藏 0 评论 0

    无欲则刚 发布了文章 · 2020-08-06

    机器学习(6):吴恩达笔记

    • 我们前边学习了线性回归和逻辑回归,但是将其应用到实际中可能产生过拟合,下边我们来看下如何解决过拟合问题

    何为过拟合

    image

    • 我们仍然以房价预测的例子来看线性回归中的过拟合:

    (1)若我们用直线去拟合数据,显然是不好的,因为房价随着面积的增大逐渐平缓,和直线的趋势不符。这种情况叫做欠拟合(高偏差),假设函数连训练集数据都没有很好地拟合
    (2)若使用二次函数拟合,则刚刚好
    (3)若使用四次多项式拟合数据,这样看上去对训练数据做了非常好的拟合,经过了所有的点。但是这条假设函数为了千方百计的拟合训练数据,用了过多的函数变量,而且是扭曲的,不能很好地泛化到新的数据中(泛化:一个假设模型应用到新样本数据中的能力)。这就叫过拟合

    • 下边我们用二分类的例子看一下逻辑回归中的过拟合:

    image

    • 后边,我们会讨论如何调试和诊断,来找出导致学习算法故障的东西;以及如何用专门的工具来识别过拟合和欠拟合,下边我们先看下如何解决过拟合问题

    解决过拟合的方法

    • 通常,过拟合是由于特征变量多,数据数量少造成的。因此,我们可以通过减少变量数量解决过拟合问题,即舍弃一部分变量。后边的模型选择算法,就是自动的保留舍弃变量。但是,舍弃变量,往往意味着舍弃了问题的一部分信息
    • 因此,目前最好用的方法是正则化。正则化能保留所有的特征变量

    正则化的代价函数

    • 我们先通过例子来直观的理解下正则化。以房价预测为例,我们要解决过拟合问题的话,就要惩罚参数3、4,让3、4尽可能的小。我们可以通过在代价函数后添加一个数(1000是随便找的比较大的数)乘3、4的平方项。这样为了让代价函数尽可能小,我们就会让3、4尽可能小;当3、4接近0时,我们可以忽略这两个数,就得到了近似二次的函数

    image

    • 这就是正则化背后的思路。通过给某些参数较小值,得到形式更为简单的函数,就不易发生过拟合了。但是,在有上百个特征的线性回归中,我们不知道哪些参数和结果的关联度小,就没法选择参数让他们变小。所以,我们惩罚除了参数0之外的所有参数,添加他们的正则化项,缩小所有的参数
    • 要注意的是,首先,我们不知道为何缩小所有参数能像房价预测只缩小高阶项参数那样避免过拟合,但这是一个事实,我们只能接受;其次,不惩罚参数0只是我们的习惯,实际上加不加上结果差异很小,我们只是出于管理不加上

    正则化参数

    • 加入正则化参数后的代价函数有两个目标:

    (1)想要假设函数更好地拟合训练集数据
    (2)要参数值尽可能的小

    我们的正则化参数就需要平衡两者
    image

    • 若我们的正则化参数值很大,将参数都惩罚到了接近0,就成了欠拟合;若正则化参数小,参数值基本不受影响,就容易变成过拟合
    • 因此我们要适当的选择正则化参数。后边我们会谈到用多重选择的方法选择正则化参数

    逻辑回归的正则化没字幕

    ...

    查看原文

    赞 0 收藏 0 评论 0

    认证与成就

    • 获得 11 次点赞
    • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

    擅长技能
    编辑

    开源项目 & 著作
    编辑

    (゚∀゚ )
    暂时没有

    注册于 2020-03-02
    个人主页被 1k 人浏览