文档章节

Sparse Autoencoder

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:27
字数 878
阅读 9
收藏 0
点赞 0
评论 0


稀疏自编码器可以看做是自编码器的一个变种,它的作用是给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下任然可以返现输入数据中一些有趣的结构。

稀疏性可以被简单地解释为:如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里我们假设的神经元的激活函数是 sigmoid 函数。如果你使用 tanh 作为激活函数的话,当神经元输出为-1的时候,我们认为神经元是被抑制的。

稀疏自编码器网络结果还是和自编码器一样,如下:


稀疏自编码器与自编码器的不同点在于损失函数的设计上面。稀疏编码是对网络的隐藏层的输出有了约束,即隐藏层神经元输出的平均值应尽量为0。也就是说,大部分的隐藏层神经元都处于非 activite 状态。因此,此时的 sparse autoencoder 损失函数表达式为:


最后的一项表示KL散度,其具体表达式如下:


隐藏层神经元 j 的平均活跃度计算如下:


其中,p 是稀疏性参数,通常是一个接近于0的很小的值(比如 p = 0.05)。换句话说,我们想要让隐藏层神经元 j 的平均活跃度接近 0.05 。为了满足这一条件,隐藏层神经元的活跃度必须接近于 0 。为了实现这一限制,所以我们才设计了上面的KL散度。

如果我们假设平均激活度 p = 0.2,那么我们就能得到下图的关系:


从图中,可以看出,当值一旦偏离期望激活度 p 时,这种误差便会急剧增大,从而作为称发现个添加到目标函数,可以指导整个网络学习出稀疏的特征表示。

实验代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tensorflow as tf 
import numpy as np 


N_INPUT = 4
N_HIDDEN = 100
N_OUTPUT = N_INPUT
BETA = tf.constant(3.0)
LAMBDA = tf.constant(.0001)
EPSILON = .00001
RHO = .1


def diff(input_data, output_data):
    ans = tf.reduce_sum(tf.pow(tf.sub(output_data, input_data), 2))
    return ans

def main(_):

    weights = {
        'hidden': tf.Variable(tf.random_normal([N_INPUT, N_HIDDEN]), name = "w_hidden"),
        'out': tf.Variable(tf.random_normal([N_HIDDEN, N_OUTPUT]), name = "w_out")
    }

    biases = {
        'hidden': tf.Variable(tf.random_normal([N_HIDDEN]), name = "b_hidden"),
        'out': tf.Variable(tf.random_normal([N_OUTPUT]), name = "b_out")
    }

    def KLD(p, q):
        invrho = tf.sub(tf.constant(1.), p)
        invrhohat = tf.sub(tf.constant(1.), q)
        addrho = tf.add(tf.mul(p, tf.log(tf.div(p, q))), tf.mul(invrho, tf.log(tf.div(invrho, invrhohat))))
        return tf.reduce_sum(addrho)

    with tf.name_scope('input'):
        # input placeholders
        x = tf.placeholder("float", [None, N_INPUT], name = "x_input")
        #hidden = tf.placeholder("float", [None, N_HIDDEN], name = "hidden_activation")

    with tf.name_scope("hidden_layer"):
        # from input layer to hidden layer
        hiddenlayer = tf.sigmoid(tf.add(tf.matmul(x, weights['hidden']), biases['hidden']))

    with tf.name_scope("output_layer"):
        # from hidden layer to output layer
        out = tf.nn.softmax(tf.add(tf.matmul(hiddenlayer, weights['out']), biases['out']))

    with tf.name_scope("loss"):
        # loss items
        cost_J = tf.reduce_sum(tf.pow(tf.sub(out, x), 2))

    with tf.name_scope("cost_sparse"):
        # KL Divergence items
        rho_hat = tf.div(tf.reduce_sum(hiddenlayer), N_HIDDEN)
        cost_sparse = tf.mul(BETA, KLD(RHO, rho_hat))

    with tf.name_scope("cost_reg"):
        # Regular items
        cost_reg = tf.mul(LAMBDA, tf.add(tf.nn.l2_loss(weights['hidden']), tf.nn.l2_loss(weights['out'])))

    with tf.name_scope("cost"):
        # cost function
        cost = tf.add(tf.add(cost_J, cost_reg), cost_sparse)

    optimizer = tf.train.AdamOptimizer().minimize(cost)

    with tf.Session() as sess:

        init = tf.initialize_all_variables()
        sess.run(init)

        input_data = np.array([[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], float)

        for i in xrange(10000):
            sess.run(optimizer, feed_dict = {x: input_data})
            if i % 100 == 0:
                tmp = sess.run(out, feed_dict = {x: input_data})
                print i, sess.run(diff(tmp, input_data))

        tmp = sess.run(out, feed_dict = {x: input_data})
        print tmp


if __name__ == '__main__':
    tf.app.run()

Reference:

Stanford Lecture

UFLDL

SAE code

本文转载自:http://www.jianshu.com/p/5f388e27dd55

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2634
码字总数 82983
作品 0
程序员
Deep Learning(深度学习)学习笔记整理系列之(四)

目录: 一、概述 二、背景 三、人脑视觉机理 四、关于特征 4.1、特征表示的粒度 4.2、初级(浅层)特征表示 4.3、结构性特征表示 4.4、需要有多少个特征? 五、Deep Learning的基本思想 六、...

云栖希望。
2017/12/04
0
0
深度网络初探

基本概念 如果已经学过了之前的课程,深度网络的概念很好理解: 在输入层如输出层之间加入若干由稀疏自编码器(Sparse autoencoder)构成的隐藏层(Hidden layer,通常多于2层),形成一个多...

Lee的白板报
2015/12/21
547
0
Deep Learning(深度学习)学习笔记整理系列之(八)

目录: 一、概述 二、背景 三、人脑视觉机理 四、关于特征 4.1、特征表示的粒度 4.2、初级(浅层)特征表示 4.3、结构性特征表示 4.4、需要有多少个特征? 五、Deep Learning的基本思想 六、...

云栖希望。
2017/12/30
0
0
Deep Learning(深度学习)学习笔记整理系列之(五)

目录: 一、概述 二、背景 三、人脑视觉机理 四、关于特征 4.1、特征表示的粒度 4.2、初级(浅层)特征表示 4.3、结构性特征表示 4.4、需要有多少个特征? 五、Deep Learning的基本思想 六、...

云栖希望。
2017/12/04
0
0
AI学习笔记——Autoencoders(自编码器)

Autoencoder 的基本概念 之前的文章介绍过机器学习中的监督学习和非监督学习,其中非监督学习简单来说就是学习人类没有标记过的数据。对于没有标记的数据最常见的应用就是通过聚类(Clusteri...

Hongtao洪滔
07/13
0
0
稀疏自动编码器 (Sparse Autoencoder)

前言 斯坦福深度学习在线课程是 Andrew Ng 编制的,该教程以深度学习中的重要概念为线索,基本勾勒出了深度学习的框架。为了简明扼要,该教程几乎省略了数学推导和证明过程。我写这个系列不追...

Lee的白板报
2015/12/08
6.4K
0
深度学习在医疗诊断领域优势明显,数据质量将成AI未来发展瓶颈

     人工智能正在改变医疗诊断行业   今年年初,谷歌成功研发出一套用于乳腺癌诊断的人工智能系统。这套系统分析了大量的病理组织显微图像,速度比人类快得多,且肿瘤检出率高达92.4%...

深度学习
2017/12/17
0
0
TensorFlow人工智能入门教程之十四 自动编码机AutoEncoder 网络

好久没有更新了,最近 想在空余时间 之外 ,对以前创业人工智能平台进行封装,想做一个人工智能顶层框架,我是实战派,不是理论派,什么BP FF 什么 SGD 等等 一大堆优化 optimation 知道偏微...

zhuyuping
2016/06/05
2.8K
1
基于 Tensorflow 的栈式自编码器--TFSAE

TFSAE 是基于 Tensorflow 的 Stacked AutoEncoder (栈式自编码器)。可用于数据降维、特征融合。下图是 TFSAE 将 iris 数据集中的 4 维特征融合为 2 维特征的示例: Encoded Iris Data(2 feat...

CrawlScript
2017/08/29
102
0
(zhuan) 深度学习全网最全学习资料汇总之模型介绍篇

This blog from : http://weibo.com/ttarticle/p/show?id=2309351000224077630868614681&u=5070353058&m=4077873754872790&cu=5070353058 深度学习全网最全学习资料汇总之模型介绍篇 雷锋网 ......

wangxiaocvpr
2017/02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!

前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据。 本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它...

crossoverJie
6分钟前
1
0
OSChina 周一乱弹 —— 你的朋友圈有点生锈了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享Trademark的单曲《Only Love (电视剧《妙手仁心 II》插曲)》: 《Only Love (电视剧《妙手仁心 II》插曲)》- Trademark 手机党少...

小小编辑
今天
204
9
【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
1
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
2
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
AB 压力测试

Ubuntu 安装AB apapt-get install apache2-utils 使用AB 压力测试 -c 并发数 -n请求总数 ab -c 3000 -n 10000 http://localhost/test/index.php AB只能测试localhost 返回结果 This is Apac......

xiawet
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部