Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

trainAutoencoder

自己符号化器の学習

説明

autoenc = trainAutoencoder(X) は、X の学習データを使用して学習させた自己符号化器 autoenc を返します。

autoenc = trainAutoencoder(X,hiddenSize) は、隠れ表現のサイズが hiddenSize の自己符号化器 autoenc を返します。

autoenc = trainAutoencoder(___,Name,Value) は、上記のいずれかの入力引数と、追加オプションとして指定される 1 つ以上のペアの引数 Name,Value について、自己符号化器 autoenc を返します。

たとえば、スパース率または学習の最大反復回数を指定できます。

すべて折りたたむ

標本データを読み込みます。

X = abalone_dataset;

X は、4177 個のアワビの貝殻について、性別 (M、F、および I (幼生))、全長、直径、高さ、全重量、むき身重量、内臓重量、貝殻重量の 8 個の属性を定義する 8 行 4177 列の行列です。このデータセットの詳細を表示するには、コマンド ラインで help abalone_dataset と入力します。

既定の設定でスパース自己符号化器に学習させます。

autoenc = trainAutoencoder(X);

学習済みの自己符号化器を使用して、アワビの貝殻の輪のデータを再構成します。

XReconstructed = predict(autoenc,X);

平均二乗再構成誤差を計算します。

mseError = mse(X-XReconstructed)
mseError = 0.0167

標本データを読み込みます。

X = abalone_dataset;

X は、4177 個のアワビの貝殻について、性別 (M、F、および I (幼生))、全長、直径、高さ、全重量、むき身重量、内臓重量、貝殻重量の 8 個の属性を定義する 8 行 4177 列の行列です。このデータセットの詳細を表示するには、コマンド ラインで help abalone_dataset と入力します。

隠れサイズ 4、最大エポック数 400、および復号化器用の線形伝達関数を使用して、スパース自己符号化器に学習させます。

autoenc = trainAutoencoder(X,4,'MaxEpochs',400,...
'DecoderTransferFunction','purelin');

学習済みの自己符号化器を使用して、アワビの貝殻の輪のデータを再構成します。

XReconstructed = predict(autoenc,X);

平均二乗再構成誤差を計算します。

mseError = mse(X-XReconstructed)
mseError = 0.0043

学習データを生成します。

rng(0,'twister'); % For reproducibility
n = 1000;
r = linspace(-10,10,n)';
x = 1 + r*5e-2 + sin(r)./r + 0.2*randn(n,1);

学習データを使用して自己符号化器に学習させます。

hiddenSize = 25;
autoenc = trainAutoencoder(x',hiddenSize,...
        'EncoderTransferFunction','satlin',...
        'DecoderTransferFunction','purelin',...
        'L2WeightRegularization',0.01,...
        'SparsityRegularization',4,...
        'SparsityProportion',0.10);

テスト データを生成します。

n = 1000;
r = sort(-10 + 20*rand(n,1));
xtest = 1 + r*5e-2 + sin(r)./r + 0.4*randn(n,1);

学習済みの自己符号化器 autoenc を使用してテスト データを予測します。

xReconstructed = predict(autoenc,xtest');

実際のテスト データと予測をプロットします。

figure;
plot(xtest,'r.');
hold on
plot(xReconstructed,'go');

学習データを読み込みます。

XTrain = digitTrainCellArrayData;

学習データは 1 行 5000 列の cell 配列です。各セルには、手書きの数字の合成イメージを表す 28 行 28 列の行列が含まれます。

25 個のニューロンが含まれる隠れ層を使用して自己符号化器に学習させます。

hiddenSize = 25;
autoenc = trainAutoencoder(XTrain,hiddenSize,...
        'L2WeightRegularization',0.004,...
        'SparsityRegularization',4,...
        'SparsityProportion',0.15);

テスト データを読み込みます。

XTest = digitTestCellArrayData;

テスト データは 1 行 5000 列の cell 配列です。各セルには、手書きの数字の合成イメージを表す 28 行 28 列の行列が含まれます。

学習済みの自己符号化器 autoenc を使用してテスト イメージ データを再構成します。

xReconstructed = predict(autoenc,XTest);

実際のテスト データを表示します。

figure;
for i = 1:20
    subplot(4,5,i);
    imshow(XTest{i});
end

再構成されたテスト データを表示します。

figure;
for i = 1:20
    subplot(4,5,i);
    imshow(xReconstructed{i});
end

入力引数

すべて折りたたむ

学習データ。学習標本の行列またはイメージ データの cell 配列として指定します。X が行列の場合、各列に 1 つの標本が含まれます。X がイメージ データの cell 配列の場合、各セルのデータの次元の数が同じでなければなりません。イメージ データは、グレー イメージのピクセル強度データにすることができます。この場合、各セルには m 行 n 列の行列が格納されます。または、イメージ データを RGB データにすることができます。この場合、各セルには m 行 n-3 列の行列が格納されます。

データ型: single | double | cell

自己符号化器の隠れ表現のサイズ。正の整数値として指定します。この数値は、隠れ層のニューロンの数になります。

データ型: single | double

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'EncoderTransferFunction','satlin','L2WeightRegularization',0.05 は、符号化器の伝達関数に正の飽和線形伝達関数、L2 重み正則化に 0.05 を指定します。

符号化器の伝達関数。'EncoderTransferFunction' と、次のいずれかで構成されるコンマ区切りのペアとして指定します。

伝達関数オプション定義
'logsig'

ロジスティック シグモイド関数

f(z)=11+ez

'satlin'

正の飽和線形伝達関数

f(z)={0,if z0z,if 0<z<11,if z1

例: 'EncoderTransferFunction','satlin'

復号化器の伝達関数。'DecoderTransferFunction' と、次のいずれかで構成されるコンマ区切りのペアとして指定します。

伝達関数オプション定義
'logsig'

ロジスティック シグモイド関数

f(z)=11+ez

'satlin'

正の飽和線形伝達関数

f(z)={0,if z0z,if 0<z<11,if z1

'purelin'

線形伝達関数

f(z)=z

例: 'DecoderTransferFunction','purelin'

学習エポックまたは反復の最大回数。'MaxEpochs' と正の整数値で構成されるコンマ区切りのペアとして指定します。

例: 'MaxEpochs',1200

コスト関数の L2 重み正則化項の係数 (LossFunction)。'L2WeightRegularization' と正のスカラー値で構成されるコンマ区切りのペアとして指定します。

例: 'L2WeightRegularization',0.05

学習に使用する損失関数。'LossFunction''msesparse' で構成されるコンマ区切りのペアとして指定します。これは、以下のようにスパース自己符号化器の学習用に調整された平均二乗誤差関数に対応しています。

E=1Nn=1Nk=1K(xknx^kn)2mean squared error+λ*ΩweightsL2regularization+β*Ωsparsitysparsityregularization,

ここで、λ は L2 正則化項の係数、β はスパース正則化項の係数です。自己符号化器の学習時に、名前と値のペアの引数 L2WeightRegularization および SparsityRegularization を使用して、λ および β の値をそれぞれ指定できます。

学習ウィンドウを表示するかどうかのインジケーター。'ShowProgressWindow' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。

例: 'ShowProgressWindow',false

ニューロンが応答する学習例の目標比率。'SparsityProportion' と正のスカラー値で構成されるコンマ区切りのペアとして指定します。スパース率は、スパース正則化項のパラメーターです。これは、隠れ層からの出力のスパース性を制御します。SparsityProportion に低い値を指定すると、通常、隠れ層の各ニューロンは、少数の学習例の出力を大きくした場合に限り "特殊化" します。したがって、スパース率を低くすると、スパース度が高くなります。スパース自己符号化器を参照してください。

例: 'SparsityProportion',0.01 は、隠れ層の各ニューロンの学習例に対する平均出力が 0.1 になるようにすることと等価です。

コスト関数のスパース正則化項の影響を制御する係数。'SparsityRegularization' と正のスカラー値で構成されるコンマ区切りのペアとして指定します。

例: 'SparsityRegularization',1.6

自己符号化器の学習に使用するアルゴリズム。'TrainingAlgorithm''trainscg' で構成されるコンマ区切りのペアとして指定します。これは、スケーリング共役勾配降下法 [1] を意味します。

入力データを再スケーリングするかどうかのインジケーター。'ScaleData' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。

自己符号化器は、出力で入力を複製しようとします。これを可能にするには、入力データの範囲が復号化器の伝達関数の範囲と一致しなければなりません。trainAutoencoder は、自己符号化器の学習時に、この範囲に合わせて学習データを自動的にスケーリングします。自己符号化器の学習時にデータがスケーリングされた場合、predictencode、および decode の各メソッドでもデータのスケーリングが行われます。

例: 'ScaleData',false

学習に GPU を使用するかどうかのインジケーター。'UseGPU' と、true または false のいずれかで構成されるコンマ区切りのペアとして指定します。

例: 'UseGPU',true

出力引数

すべて折りたたむ

学習済みの自己符号化器。Autoencoder オブジェクトとして返されます。このオブジェクトのプロパティとメソッドについては、Autoencoder クラスのページを参照してください。

詳細

すべて折りたたむ

自己符号化器

自己符号化器とは、出力で入力を複製するように学習させられたニューラル ネットワークです。自己符号化器は、深層ニューラル ネットワークに学習させるツールとして使用できます。ラベル付けされたデータを必要としないという意味で、自己符号化器が行う学習は教師なし学習です。ただし、学習プロセスはコスト関数の最適化をベースにしています。コスト関数は、入力 x と、その出力での再構成 x^ の誤差を測定します。

自己符号化器は、符号化器と復号化器で構成されています。符号化器と復号化器には複数の層がある場合がありますが、単純化のために、それぞれの層が 1 つだけであると考えます。

自己符号化器への入力がベクトル xDx である場合、符号化器は以下のようにベクトル x を別のベクトル zD(1) にマッピングします。

z=h(1)(W(1)x+b(1)),

ここで、上付き文字 (1) は最初の層を示します。h(1):D(1)D(1) は符号化器の伝達関数、W(1)D(1)×Dx は重み行列、b(1)D(1) はバイアス ベクトルです。次に、復号化器が、符号化された表現 z を以下のように元の入力ベクトル x の推定に逆マッピングします。

x^=h(2)(W(2)z+b(2)),

ここで、上付き文字 (2) は 2 番目の層を表します。h(2):DxDx は復号化器の伝達関数、W(1)Dx×D(1) は重み行列、b(2)Dx はバイアス ベクトルです。

スパース自己符号化器

正則化項をコスト関数に追加することによって、自己符号化器のスパース性を高めることができます [2]。この正則化項は、ニューロンの平均出力活性化値の関数です。ニューロン i の平均出力活性化測定値は、以下のように定義されます。

ρ^i=1nj=1nzi(1)(xj)=1nj=1nh(wi(1)Txj+bi(1)),

ここで、n は学習例の総数です。xj は j 番目の学習例、wi(1)T は重み行列 W(1) の i 番目の行、bi(1) はバイアス ベクトル b(1) の i 番目のエントリです。出力活性化値が大きい場合、ニューロンが '活性化' していると見なされます。出力活性化値が小さい場合、学習例の数が少ないことに応答して隠れ層のニューロンが活性化することを意味します。コスト関数に ρ^i の値を低く抑える項を追加すると、自己符号化器が表現を学習するようになります。隠れ層の各ニューロンは、学習例の数が少ないことに対して活性化します。つまり、各ニューロンは、学習例の小規模サブセットだけに含まれる特定の特徴に応答することによって特殊化します。

スパース正則化

スパース正則化項は、隠れ層からの出力のスパース性に制約を課そうとします。ニューロン i の平均出力活性化値 ρ^i とその目標値 ρ が近くない場合に大きな値を取る正則化項を追加することによって、スパース性を高めることができます [2]。このようなスパース正則化項の 1 つとして、カルバック・ライブラー ダイバージェンスが挙げられます。

Ωsparsity=i=1D(1)KL(ρρ^i)=i=1D(1)ρlog(ρρ^i)+(1ρ)log(1ρ1ρ^i)

カルバック・ライブラー ダイバージェンスは、2 つの分布の違いを測定する関数です。この場合、ρ および ρ^i が互いに等しい場合には値 0 を取り、互いの差が開くに従い値が大きくなります。コスト関数を最小化するとこの項が小さくなるため、ρρ^i が互いに近くなります。自己符号化器の学習時に、名前と値のペアの引数 SparsityProportion を使用して、平均活性化値の目標値を定義できます。

L2 正則化

スパース自己符号化器の学習を行う場合、重み w(l) の値を大きく、z(1) の値を小さくすることによって、スパース正則化項を小さくすることができます [2]。コスト関数に対する重みに正則化項を追加すると、これが起こらなくなります。この項は L2 正則化項と呼ばれ、以下のように定義されます。

Ωweights=12lLjnik(wji(l))2,

ここで、L は隠れ層の数、n は観測値 (例) の数、k は学習データ内の変数の数です。

コスト関数

スパース自己符号化器の学習用のコスト関数は、以下のような調整された平均二乗誤差関数です。

E=1Nn=1Nk=1K(xknx^kn)2mean squared error+λ*ΩweightsL2regularization+β*Ωsparsitysparsityregularization,

ここで、λ は L2 正則化項の係数、β はスパース正則化項の係数です。自己符号化器の学習時に、名前と値のペアの引数 L2WeightRegularization および SparsityRegularization を使用して、λ および β の値をそれぞれ指定できます。

参照

[1] Moller, M. F. “A Scaled Conjugate Gradient Algorithm for Fast Supervised Learning”, Neural Networks, Vol. 6, 1993, pp. 525–533.

[2] Olshausen, B. A. and D. J. Field. “Sparse Coding with an Overcomplete Basis Set: A Strategy Employed by V1.” Vision Research, Vol.37, 1997, pp.3311–3325.

R2015b で導入