1. 程式人生 > >深度學習20-限制玻爾茲曼機RBM

深度學習20-限制玻爾茲曼機RBM

玻爾茲曼機來源於玻爾茲曼分佈,而玻爾茲曼分佈的創立者是路德維希·玻爾茲曼,這個原理來源於他首次將統計學用於研究熱力學,即物質的狀態概率和它對應的能量有關。比如,我們常用熵來形容物體的混亂程度,同時如果我們的定義足夠好,任何物質其實都有它的一個“能量函式”,這個能量函式表示物體當前的狀態穩定程度,比如一包整齊的火柴在沒有扔出去之前,它的排列是很有秩序的,但是它會趨向於不穩定的排布,因而,當前的能量很低,一旦被扔出,成為散亂狀態,能量就很高。

1、使用場景: 限制玻爾茲曼機並不是一個分類器或者預測模型,而是一個類似於PCA的特徵提取模型,它通過一種雙層網路來提取資料特徵,而這些資料特徵可以重構出原來的資料。常用來提取影象和語音特徵,結構圖如下: enter description here

提取結果如下: enter description here

2、基本原理: 由於RBM詳細原理涉及太多的數學推導,同時還存在物理和數學的交叉理論,其中的許多道理也並不是公式能夠說通的,就像愛因斯坦的質能方程一樣,它的提出並沒有什麼道理,無規律可尋,但是它卻實實在在的反映了質量和能量的關係,所以這個公式就是有意義的。同樣這裡的能量和概率的關係也是這樣,通過將物理學的能量引入到神經網路,而通過數學推導,其中的能量解釋恰好和sigmoid函式相同,因而就能直接通過這種網路來提取特徵。

為了直接講清RBM的原理,這裡,我直接說下我的理解,可能不對但也可能提供一些方面的思路:RBM是一個特徵提取網路,比如,我們需要造一臺翻譯機器,可以將某個三維人體畫成二維影象,同時,它也能通過二維影象反向重構三維人體,這個簡單的原理類似於編解碼模型,但是不同的是,這裡的編解碼使用的是同一個權重,即往返道路是一條。

為了解決上述的問題,我們假設三維是A1,二維是B1,兩個操作分別是編碼和解碼;起初,我們會讓編碼器根據A1畫一張二維圖B2,然後讓解碼器基於畫的二維圖B2重構三維圖A2,通過對比A1和A2就可以判斷當前機器的智慧程度。但是這裡又有一個問題,這樣漫無目的的隨機畫圖,如果沒有偶然音素,找到一個好的模型基本上是不可能的,所以,我們需要有一個訓練方向,一般情況可以直接使用梯度下降或者上升。

但是另一個問題來了,一個樣本的訓練怎麼能夠代表整體?因而為了儘可能的學習整體的體徵,要麼找到一個好的取樣方法,要麼儘可能的取樣直到找到一個能夠反映整體樣本。顯然,我們需要一個好的取樣方法來模擬這個過程。

過程圖 其中Vb\Wn\Hb分別代表可見層偏置\權重\隱藏層偏置,我們需要通過不斷地馬爾科夫轉移,找到一個最合理的An\Bn。

2、基本理論

  • Bayes定理: enter description here

  • MCMC蒙特卡羅模型: 蒙特卡羅是一種通過概率求解積分的演算法,如果我們不知道某個函式的積分,但是通過對應函式的概率函式就可以近似模擬對應的積分。比如求解圓周率π,我們可以直接隨機一個單位為1的正方形,通過判斷落在圓中點的個數就能夠近似求解圓周率。進一步,我們這裡的x、y是均值分佈,如果它的分佈並不是均勻分佈,而是服從f(x)的分佈,就需要更具f(x)來求解,如下: enter description here

    假設計算enter description here,如果無法通過數學推導直接求出解析解,一般不可能對區間(a,b)上所有的x值進行列舉,我們可以將h(x)分解為某個函式f(x)和一個定義在(a,b)上的概率密度函式p(x)的乘積,則整個積分可以寫成enter description here,這樣原積分等同於f(x)在p(x)這個分佈上的均值。這時,如果我們從分佈p(x)上採集大量的樣本點,這些樣本符合分佈p(x),即有enter description here。那麼我們就可以通過這些樣本來逼近這個均值enter description here,這就是蒙特卡羅方法的基本思想。蒙特卡羅方法的核心問題是如何從分佈上隨機採集樣本,一般採用馬爾可夫鏈蒙特卡羅方法(Markov Chain Monte Carlo,MCMC)產生指定分佈下的樣本。

  • 馬爾可夫鏈: 馬爾科夫鏈即狀態轉移函式,把畫圖和重構比作AB兩個過程,通過不斷地A-B-A-B-A-B-A-B…最後A和B的分佈將近似接近現實的分佈。

    離散時間上隨機變數隨時間變化的轉移概率僅僅依賴於當前值的序列,MCMC建立的理論基礎:如果我們想在某個分佈下采樣,只需要模擬以其為平穩分佈的馬爾科夫過程,經過足夠多次轉移之後,我們的樣本分佈就會充分接近於該平穩分佈,也就意味著我們近似地採集目標分佈下的樣本。

3、網路結構:

RBM由兩層構成,可見層和隱藏層,分別對因原始資料和特徵資料。 構建過程: enter description here 即:f(x) = w*x+hb 其中hb為隱藏層偏差

重構過程: enter description here 即:h(x) = w*x’+vb 其中vb為可見層偏差

4、理論推導

  • 能量函式和概率分佈: 這裡作者定義了一個能量函式,而分佈的概率是通過能量函式來求解,這裡的理論其實並不重要,它的作用就是sigmoid函式的作用。

定義某個分佈的概率為: enter description here 其中 s 是某個量子態, E(s) 為這個狀態的能量, P(s) 為這個狀態出現的概率。 考慮到某一個單個單元的狀態i,有: enter description here 或寫為: enter description here

這裡的E如何設定,由於這個知識設計到物理學知識,它的由來是從物理學變換過來的,公式如下: enter description here 對於其中一個隱藏權重hi,我們可以將某個神經元 hi 關聯的能量分離出來,也就是: enter description here 其中 Wi 是和神經元 hi 相連的權重,h’ 是除去 hi 的向量。 為了方便,我們把和 hi 無關的部分記作: enter description here 於是得: enter description here 推出: enter description here 即最後的結果就是用sigmoid函式作用在狀態轉移結果上,即: enter description here

最終的所有的理論就是一個sigmoid函式:玻爾茲曼分佈下隱含層神經元啟用的條件概率的啟用函式。

最後我們得到隱藏層和可見層的編解碼結果: enter description here enter description here 這裡的結果在0-1之間。這裡將結果解釋為分類對錯的能力,1代表對,0代表錯。訓練目標即最大化似然函式:enter description here,一般通過對數轉化為連加的形式,其等價形式:enter description hereenter description here簡記為enter description here

  • 梯度計算: 梯度上升法:enter description here

由於梯度求解的原理正是找到一個完全符合原始分佈的樣本,但是這個尋找過程很難,所以,目前的基本方式主要採用吉布斯取樣和對比散度來進行訓練。

5、實實踐案例: example1:sklearn數字影象特徵提取

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neural_network import BernoulliRBM

img0 = np.array(Image.open('zero.png').convert('L'))

#標準化資料,只有01的值
def normalize_data(data):  # 0.1<=data[i][j]<=0.9
    data = (data - np.mean(data)) / np.std(data)
    rows,cols = data.shape
    for i in range(rows):
      for j in range(cols):
        if (data[i,j] > 0):
          data[i,j] = 1
        else:
          data[i,j] = 0
    return data

img0 = normalize_data(img0)

rbm = BernoulliRBM(n_components=20, learning_rate=0.06, batch_size=10, n_iter=200, verbose=True, random_state=0)
rbm.fit(img0)
#得到權值矩陣、隱藏層偏置值和顯示層的偏置值
weight = rbm.components_
baise = rbm.intercept_hidden_
baise_vis = rbm.intercept_visible_

#逆向還原輸入的圖片
hidden_img = np.dot(img0, weight.T) + baise
reverimg = np.dot(hidden_img, weight) + baise_vis
#print(reverimg.shape)


#圖片輸出顯示
ax = plt.subplot(1, 3, 1)
plt.title('original image')
plt.imshow(img0, cmap='gray')
ax = plt.subplot(1, 3, 2)
plt.title('hidden_img')
plt.imshow(hidden_img, cmap='gray')
ax = plt.subplot(1, 3, 3)
plt.title('reverimg')
plt.imshow(reverimg, cmap='gray')
plt.show()

enter description here

example2:使用rbm特徵做迴歸分類

"""
==============================================================
Restricted Boltzmann Machine features for digit classification
==============================================================

For greyscale image data where pixel values can be interpreted as degrees of
blackness on a white background, like handwritten digit recognition, the
Bernoulli Restricted Boltzmann machine model (:class:`BernoulliRBM
<sklearn.neural_network.BernoulliRBM>`) can perform effective non-linear
feature extraction.

In order to learn good latent representations from a small dataset, we
artificially generate more labeled data by perturbing the training data with
linear shifts of 1 pixel in each direction.

This example shows how to build a classification pipeline with a BernoulliRBM
feature extractor and a :class:`LogisticRegression
<sklearn.linear_model.LogisticRegression>` classifier. The hyperparameters
of the entire model (learning rate, hidden layer size, regularization)
were optimized by grid search, but the search is not reproduced here because
of runtime constraints.

Logistic regression on raw pixel values is presented for comparison. The
example shows that the features extracted by the BernoulliRBM help improve the
classification accuracy.
"""

from __future__ import print_function

print(__doc__)

# Authors: Yann N. Dauphin, Vlad Niculae, Gabriel Synnaeve
# License: BSD

import numpy as np
import matplotlib.pyplot as plt

from scipy.ndimage import convolve
from sklearn import linear_model, datasets, metrics
from sklearn.model_selection import train_test_split
from sklearn.neural_network import BernoulliRBM
from sklearn.pipeline import Pipeline
from sklearn.base import clone


# #############################################################################
# Setting up

def nudge_dataset(X, Y):
    """
    上下左右四個方向做卷積,4+1=5,複製5倍
    This produces a dataset 5 times bigger than the original one,
    by moving the 8x8 images in X around by 1px to left, right, down, up
    """
    direction_vectors = [
        [[0, 1, 0],
         [0, 0, 0],
         [0, 0, 0]],

        [[0, 0, 0],
         [1, 0, 0],
         [0, 0, 0]],

        [[0, 0, 0],
         [0, 0, 1],
         [0, 0, 0]],

        [[0, 0, 0],
         [0, 0, 0],
         [0, 1, 0]]]

    def shift(x, w):
        return convolve(x.reshape((8, 8)), mode='constant', weights=w).ravel()

    X = np.concatenate([X] +
                       [np.apply_along_axis(shift, 1, X, vector)
                        for vector in direction_vectors])
    Y = np.concatenate([Y for _ in range(5)], axis=0)
    return X, Y


# Load Data
digits = datasets.load_digits()
X = np.asarray(digits.data, 'float32')
X, Y = nudge_dataset(X, digits.target)
# 歸一化到0-1
X = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001)  # 0-1 scaling

X_train, X_test, Y_train, Y_test = train_test_split(
    X, Y, test_size=0.2, random_state=0)

# Models we will use
logistic = linear_model.LogisticRegression(solver='lbfgs', max_iter=10000,
                                           multi_class='multinomial')
rbm = BernoulliRBM(random_state=0, verbose=True)

rbm_features_classifier = Pipeline(
    steps=[('rbm', rbm), ('logistic', logistic)])

# #############################################################################
# Training

# Hyper-parameters. These were set by cross-validation,
# using a GridSearchCV. Here we are not performing cross-validation to
# save time.
rbm.learning_rate = 0.06
rbm.n_iter = 20
# More components tend to give better prediction performance, but larger
# fitting time
rbm.n_components = 100 # 隱藏層,相當於特徵值
logistic.C = 6000 # 正則化係數λ的倒數,通常預設為1,越大正則化越微小,預設為1


# 利用管道一次定義訓練,多步使用
# Training RBM-Logistic Pipeline
rbm_features_classifier.fit(X_train, Y_train)

# Training the Logistic regression classifier directly on the pixel
raw_pixel_classifier = clone(logistic)
raw_pixel_classifier.C = 100.
raw_pixel_classifier.fit(X_train, Y_train)

# #############################################################################
# Evaluation

Y_pred = rbm_features_classifier.predict(X_test)
print("Logistic regression using RBM features:\n%s\n" % (
    metrics.classification_report(Y_test, Y_pred)))

Y_pred = raw_pixel_classifier.predict(X_test)
print("Logistic regression using raw pixel features:\n%s\n" % (
    metrics.classification_report(Y_test, Y_pred)))

# #############################################################################
# Plotting

plt.figure(figsize=(4.2, 4))
for i, comp in enumerate(rbm.components_):
    plt.subplot(10, 10, i + 1)
    plt.imshow(comp.reshape((8, 8)), cmap=plt.cm.gray_r,
               interpolation='nearest')
    plt.xticks(())
    plt.yticks(())
plt.suptitle('100 components extracted by RBM', fontsize=16)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)

plt.show()

使用rbm特徵提取前和提取後迴歸分類器的效能對比

rbm提取的100個特徵

example3:rbm的tensorflow實現-數字影象處理特徵提取

"""
Restricted Boltzmann Machines (RBM)
author: Ye Hu
2016/12/18
"""
import os
import timeit
import numpy as np
import tensorflow as tf
from PIL import Image
from unit06_rbm.utils import tile_raster_images
from unit06_rbm import input_data


class RBM(object):
    """A Restricted Boltzmann Machines class"""

    def __init__(self, inpt=None, n_visiable=784, n_hidden=500, W=None,
                 hbias=None, vbias=None):
        """
        :param inpt: Tensor, the input tensor [None, n_visiable]
        :param n_visiable: int, number of visiable units
        :param n_hidden: int, number of hidden units
        :param W, hbias, vbias: Tensor, the parameters of RBM (tf.Variable)
        """
        self.n_visiable = n_visiable
        self.n_hidden = n_hidden
        # Optionally initialize input
        if inpt is None:
            inpt = tf.placeholder(dtype=tf.float32, shape=[None, self.n_visiable])
        self.input = inpt
        # Initialize the parameters if not given
        if W is None:
            bounds = -4.0 * np.sqrt(6.0 / (self.n_visiable + self.n_hidden))
            W = tf.Variable(tf.random_uniform([self.n_visiable, self.n_hidden], minval=-bounds,
                                              maxval=bounds), dtype=tf.float32)
        if hbias is None:
            hbias = tf.Variable(tf.zeros([self.n_hidden, ]), dtype=tf.float32)
        if vbias is None:
            vbias = tf.Variable(tf.zeros([self.n_visiable, ]), dtype=tf.float32)
        self.W = W
        self.hbias = hbias
        self.vbias = vbias
        # keep track of parameters for training (DBN)
        self.params = [self.W, self.hbias, self.vbias]

    def propup(self, v):
        """Compute the sigmoid activation for hidden units given visible units"""
        return tf.nn.sigmoid(tf.matmul(v, self.W) + self.hbias)

    def propdown(self, h):
        """Compute the sigmoid activation for visible units given hidden units"""
        return tf.nn.sigmoid(tf.matmul(h, tf.transpose(self.W)) + self.vbias)

    def sample_prob(self, prob):
        """Do sampling with the given probability (you can use binomial in Theano)"""
        return tf.nn.relu(tf.sign(prob - tf.random_uniform(tf.shape(prob))))

    def sample_h_given_v(self, v0_sample):
        """Sampling the hidden units given visiable sample"""
        h1_mean = self.propup(v0_sample)
        h1_sample = self.sample_prob(h1_mean)
        return (h1_mean, h1_sample)

    def sample_v_given_h(self, h0_sample):
        """Sampling the visiable units given hidden sample"""
        v1_mean = self.propdown(h0_sample)
        v1_sample = self.sample_prob(v1_mean)
        return (v1_mean, v1_sample)

    def gibbs_vhv(self, v0_sample):
        """Implement one step of Gibbs sampling from the visiable state"""
        h1_mean, h1_sample = self.sample_h_given_v(v0_sample)
        v1_mean, v1_sample = self.sample_v_given_h(h1_sample)
        return (h1_mean, h1_sample, v1_mean, v1_sample)

    def gibbs_hvh(self
            
           

相關推薦

深度學習20-限制RBM

玻爾茲曼機來源於玻爾茲曼分佈,而玻爾茲曼分佈的創立者是路德維希·玻爾茲曼,這個原理來源於他首次將統計學用於研究熱力學,即物質的狀態概率和它對應的能量有關。比如,我們常用熵來形容物體的混亂程度,同時如果我們的定義足夠好,任何物質其實都有它的一個“能量函式”,這個

限制(RBM)用於電影推薦小例

lips 開發 rec tran 必須 int png a* __init__ 原文章:http://blog.csdn.net/u010223750/article/details/61196549 1 #coding=‘utf-8‘ 2 """ 3 de

簡單理解●限制RBM

所謂概率圖模型,就是指運用了概率和圖這兩種工具建立的模型(逐漸忘記標題),咳咳,今天講一下限制玻爾茲曼機,或者叫做受限玻爾茲曼機,這個名字起的真是,。。,好的,咳咳 所謂玻爾茲曼機,就是就是玻爾茲曼家的

《白話深度學習與Tensorflow》學習筆記(7)RBM限制

不受限的:在實際工程中用處不大,所以目前只需要研究受限玻爾茲曼機。 一層是視覺化層,一般來說是輸入層,另一層是隱含層,也就是我們一般指的特徵提取層。 RBM是可以多層疊加在一起的。 上面的h1到hn是n個實數,下面的v1到vm是m個實數,都是0到1

深度學習方法:受限RBM(三)模型求解,Gibbs sampling

歡迎轉載,轉載請註明:本文出自Bin的專欄blog.csdn.net/xbinworld。  技術交流QQ群:433250724,歡迎對演算法、技術、應用感興趣的同學加入。 接下來重點講一下RBM模型求解方法,其實用的依然是梯度優化方法,但是求解需要用

[深度信念網絡][] DBN (Deep Belief Network) RBM (Restricted Boltzmann Machine) 原理講解

mac 隨機 ted 圖片 程序 inf nbsp 深度 理論 主要講了玻爾茲曼機的推導以及二值RBM,這一部分程序很簡單但理論感覺不是很好講,涉及到挺多隨機過程和概率的知識。Bengio那篇文章其實講的很詳細,不過他是從自由能的角度講的,物理意義挺清楚但推導過程不如網上有

Restricted Boltzmann Machine(限制

RBM原理: 玻爾茲曼機最初是作為一種廣義的“聯結主義”引入,用來學習向量上的任意概率分佈。聯結主義(connectionism)的中心思想是,當網路將大量簡單計算單元連線在一起時可以實現智慧的行為。分散式表示(distributed representation)認為系統每個

受限(RBM)原理分析以及在Tensorflow的實現

簡介 受限玻爾茲曼機是一種無監督,重構原始資料的一個簡單的神經網路。  受限玻爾茲曼機先把輸入轉為可以表示它們的一系列輸出;這些輸出可以反向重構這些輸入。通過前向和後向訓練,訓練好的網路能夠提取出輸入中最重要的特徵。 為什麼RBM很重要? 因為它能夠自動地從輸入中提

受限RBM最通俗易懂的教程

本人來到CSDN已經有一段時間了,寫文章也寫了好幾篇了,本人最喜歡的風格就是用白話講解一些通俗易懂的東西,在之前,我講了不少東西,也不知道大家懂沒懂,但沒關係,你們愛懂不懂,哈哈哈哈哈哈哈哈哈哈。 但這次,我要講的東西我覺得你們都能懂,不懂我認作你爹,哈哈哈哈哈哈哈哈哈哈哈

深度學習 --- 受限(馬科夫過程、馬科夫鏈)

        上一節我們詳細的探討了玻爾茲曼機,玻爾茲曼機的發明是為了解決Hopfield神經網路的偽吸引子的問題,因此把退火演算法、玻爾茲曼分佈和Hopfield神經網路結合在一起形成了玻爾茲曼機(隨機神經網路)。通過前面幾節我們知道玻爾茲曼機可以很好

深度學習 --- 隨機神經網路詳解(學習演算法、執行演算法)

BM網路的學習演算法 (1)  學習過程       通過有導師學習,BM網路可以對訓練集中各模式的概率分佈進行模擬,從而實現聯想記憶.學習的目的是通過調整網路權值使訓練集中的模式在網路狀態中以相同的概率再現.學習過程可分為兩個階段;第一階段

達觀資料於敬:深度學習來一波,受限原理及在推薦系統中的應用

深度學習相關技術近年來在工程界可謂是風生水起,在自然語言處理、影象和視訊識別等領域得到極其廣泛的應用,並且在效果上更是碾壓傳統的機器學習。一方面相對傳統的機器學習,深度學習使用更多的資料可以進行更好的擴充套件,並且具有非常優異的自動提取抽象特徵的能力。 另外得益於GPU、SSD儲存、大

深度學習讀書筆記之RBM限制

深度學習讀書筆記之RBM 宣告: 1)看到其他部落格如@zouxy09都有個宣告,老衲也抄襲一下這個東西 2)該博文是整理自網上很大牛和機器學習專家所無私奉獻的資料的。具體引用的資料請看參考文獻。具體的版本宣告也參考原文獻。 3)本文僅供學術交流,非商用。所以每一部分具體

深度置信網路(DBN)和受限RBM

原部落格於http://blog.163.com/silence_ellen/blog/static/176104222201431710264087/ 本篇非常簡要地介紹了深度信念網路的基本概念。文章先簡要介紹了深度信念網路(包括其應用例項)。接著分別講述了:(1)

受限基礎教程

unit 單個 單元 閾值 導致 相關數 負責 權重 自動編碼器 定義與結構 受限玻爾茲曼機(RBM)由Geoff Hinton發明,是一種用於降維、分類、回歸、協同過濾、特征學習和主題建模的算法。(如需通過實例了解RBM等神經網絡的應用方法,請參閱應用案例)。

受限RBM)原理總結

guid filter font list cuc spa 得到 aci dcb https://blog.csdn.net/l7H9JA4/article/details/81463954 授權轉發自:劉建平《受限玻爾茲曼機(RBM)原理總結》 地址:http://w

七.RBM受限

1、受限玻爾茲曼機    玻爾茲曼機是一大類的神經網路模型,但是在實際應用中使用最多的則是受限玻爾茲曼機(RBM)。   受限玻爾茲曼機(RBM)是一個隨機神經網路(即當網路的神經元節點被啟用時會有隨機行為,隨機取值)。它包含一層可視層和一層隱藏層。在同一層的神經元之間是相互獨立的,而

六.隨機神經網路Boltzmann(

Hopfield網路具有最優計算功能,然而網路只能嚴格按照能量函式遞減方式演化,很難避免偽狀態的出現,且權值容易陷入區域性極小值,無法收斂於全域性最優解。 如果反饋神經網路的迭代過程不是那麼死板,可以在一定程度上暫時接受能量函式變大的結果,就有可能跳出區域性極小值。隨機神經網路的核心思想就是在網路中加入概率

RBM(受限)和深層信念網絡(Deep Brief Network)

例如 sha 目標 監督學習 怎麽 繼續 定義 再次 rbm 目錄: 一、RBM 二、Deep Brief Network 三、Deep Autoencoder 一、RBM 1、定義【無監督學習】 RBM記住三個要訣:1)

RBM(受限)和深層信念網路(Deep Brief Network)

 目錄: 一、RBM 二、Deep Brief Network 三、Deep Autoencoder   一、RBM 1、定義【無監督學習】 RBM記住三個要訣:1)兩層結構圖,可視層和隱藏層;【沒輸出層】2)層內無連線,層間全連線;3)二值狀態值,