昨今、AI(人工知能)という言葉をよく耳にしますよね。皆さんの周りにもスマートスピーカーなど様々なAI(人工知能)を使ったサービスが身近にあり、AI(人工知能)を使って機械学習を始めたい方もいるかもしれません。
そんなAI(人工知能)ブームを作った1つの要因として、ディープラーニングがあります。ディープラーニングとは多層のニューラルネットワークで学習をするモデルのことで、そのディープラーニングを支える技術がAutoencoder(オートエンコーダー)です。Autoencoder(オートエンコーダー)は今までニューラルネットワークを多層にすると、誤差が消失してしまい精度が下がる問題、学習データに適合しすぎてしまい汎化性能を下げてしまう過学習が起こる問題を解決する画期的なものです。この記事ではAutoencoder(オートエンコーダー)を一から解説するので、ぜひマスターして過学習を防げるようにしましょう。
そこで今回は、AI(人工知能)ブームのきっかけとなったディープラーニングに搭載されているAutoencoder(オートエンコーダー)について理論と実装についてお伝えします。
Autoencoder(オートエンコーダー)とは、仕組みも合わせて解説
Autoencoder(オートエンコーダー)は、ニューラルネットワークを使用した次元圧縮のためのアルゴリズムのことです。
特徴は入力層、隠れ層、出力層で構成されるニューラルネットワークを作りますが、Autoencoder(オートエンコーダー)は入力層から入力されたデータを隠れ層において次元を圧縮して、必要な特徴量を抽出し、出力層に出力する際は次元を圧縮したものを元の次元に復元して出力する仕組みです。
※詳しい説明はこちら
次元を圧縮するニューラルネットワークと圧縮をエンコーダー、圧縮したデータを復元するニューラルネットワークをデコーダーと呼びます。Autoencoder(オートエンコーダー)の学習は、大量のデータを使ってデータの圧縮と復元を繰り返し、エンコーダーとデコーダーのニューラルネットワークのそれぞれを調整します。これによって、元データと復元データの誤差を最小にします。
Autoencoder(オートエンコーダー)の種類をそれぞれ解説
Autoencoder(オートエンコーダー)は、利用される用途によって、様々な種類があります。
積層オートエンコーダー(Stacked Autoencoder)
積層オートエンコーダーは、Autoencoder(オートエンコーダー)を多層に重ねた構造をしているものです。
特徴としては、入力層に近い層から順に学習を行っていき、Autoencoder(オートエンコーダー)を順番に学習する事前学習を行います。そこで初期の重みを事前学習により設定します。Autoencoder(オートエンコーダー)を積み重ねるだけでは、ラベル等の分類を出力しないため、分類問題では、最後にロジスティック回帰層、回帰問題では、線形回帰層を追加することで教師あり学習を行うことができます。
例えば、大量のデータを学習させたAutoencoder(オートエンコーダー)に少量のデータでファインチューニングを行うだけで分類問題を解けます。
変分オートエンコーダー(Variational Autoencoder)
変分オートエンコーダーは、ディープラーニングによる生成モデルの1つで、学習データを元にその特徴を捉えて学習データセットに似たデータを生成できます。積層エンコーダーとの違いは、入力データの次元を圧縮して、デコードする際に一部データを変換することです。
方法としてはAutoencoder(オートエンコーダー)のエンコードし、特徴量を抽出した後、デコードする際に変数をある次元に落とし込んでデコードします。特徴は、未学習部分の特徴を再現しないという点です。そのため、異常検知で利用されます。
Autoencoder(オートエンコーダー)を使うメリット
Autoencoder(オートエンコーダー)を使うメリットは、2つです。
誤差が消失しづらい
ニューラルネットワークにおいて、層を重ねると、より複雑な処理がでる一方で、層を重ねすぎると逆に精度が落ちてしまうという問題が生じていました。これは、誤差逆伝播法で、予測と正解の誤差を利用して学習していくのですが、その誤差は層を重ねるとともに消失してしまい、結果的に精度が下がっています。
そこでAutoencoder(オートエンコーダー)を用いて重みについて事前に学習が行われて調整されているため、適切な重みづけから予測を行えるようになったため、精度が高い学習を行えます。
過学習を起こしにくい
過学習とは、学習データに適合しすぎて汎化性能を失った状態のことをいいます。Autoencoder(オートエンコーダー)は次元を圧縮して学習をしているため、必要な特徴量だけに絞って学習をおこなうようになったため、学習データに過剰に適合することが少なくなり未知のデータに対する精度も高くなります。
なお、過学習の対策はこちらでも解説しています。
Autoencoder(オートエンコーダー)の活用例
Autoencoder(オートエンコーダー)は、様々なものに活用されています。
異常検知
Autoencoder(オートエンコーダー)が最も利用されているものの1つとして、異常検知があります。変分オートエンコーダーを利用して、正常品をまず事前に学習します。正常品を学習したモデルに、工場などのコンベアなどで流れてくる製品の写真を順次読み込ませます。もしも、正常品と異なる傷などの異常があった場合は、正常品との誤差が大きくなり異常なものと判定をできます。
もう一つの異常検知の方法として、Autoencoder(オートエンコーダー)のエンコード部分のみを利用します。エンコードしたときには、必要な特徴量のみを抽出できます。そのため、例えば、5万個の製品について、エンコードした際の特徴量でクラスタリングを行って、その分布を見ながら、100個だけ、正常品か異常品かのラベルを付けます。その際の分布によって異常品と近い位置にクラスタリングされている商品を異常と判定する方法です。
※異常検知について知りたい方は、こちらをご覧ください
画像生成
画像生成や文章生成においてもAutoencoder(オートエンコーダー)は広く利用されています。画像生成においては、大量の6という数字のデータのみを学習させたのち、様々な数字のデータを入力すると、6のような数字が生成されるというような例があります。
また、文章生成においては、大量の広告文のキャッチフレーズを学習させます。その後、キーワードを入力すると様々な広告文を作成できます。
Autoencoder(オートエンコーダー)の実装方法
Autoencoder(オートエンコーダー)の実装は、TensorflowやKeras、Pytorchなど様々ライブラリにおいてメソッドが搭載されています。今回はTensorFlowを用いた実装方法を紹介します。
まずは、必要なライブラリをインポートしましょう。
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, losses
from tensorflow.keras.datasets import fashion_mnist
from tensorflow.keras.models import Model
次に、FashionMNISTという服の画像のデータセットをダウンロードします。この画像は28×28ピクセルです。
x_train = x_train.astype(‘float32’) / 255.
x_test = x_test.astype(‘float32’) / 255.
次に画像を64次元に圧縮するエンコーダーと元の画像に復元するデコーダーをでき議します。
latent_dim = 64
class Autoencoder(Model):
def __init__(self, latent_dim):
super(Autoencoder, self).__init__()
self.latent_dim = latent_dim
self.encoder = tf.keras.Sequential([
layers.Flatten(),
layers.Dense(latent_dim, activation=’relu’),
])
self.decoder = tf.keras.Sequential([
layers.Dense(784, activation=’sigmoid’),
layers.Reshape((28, 28))
])
def call(self, x):
encoded = self.encoder(x)
decoded = self.decoder(encoded)
return decoded
autoencoder = Autoencoder(latent_dim)
autoencoder.compile(optimizer=’adam’, loss=losses.MeanSquaredError())
モデルの定義が完了したので、実際に学習を行います。
epochs=10,
shuffle=True,
validation_data=(x_test, x_test))
学習が完了したので、検証データで実際に、データを復元します。
decoded_imgs = autoencoder.decoder(encoded_imgs).numpy()
これで、予測も完了しました。この後は、matplotlibなどを利用して結果を表示させてみましょう。
Autoencoder(オートエンコーダー)の実装の際の注意点
Autoencoder(オートエンコーダー)の実装の際の注意点は、必ず初めのうちはTensorflowやPytorchなどのライブラリを利用することです。実装する際は、もちろん0から自分で書くこともできるのですが、初心者にとっては実装するのが非常に難しいです。各ライブラリのホームページには、実装方法のチュートリアルなどもあるので、必ず確認をしてから実装をしましょう。
また、Autoencoder(オートエンコーダー)の実装はどのような層の構造にするべきか、が最初は本当に分からないですよね。まずは、いろいろな次元の層を実装して結果を見てみることが重要。その後、層を増やしたり次元数を調整したりして、結果を調整しましょう。
さて今回は、Autoencoder(オートエンコーダー)の理論と実装方法について紹介しました。
- Autoencoder(オートエンコーダー)は、ニューラルネットワークを使用した次元圧縮のためのアルゴリズムである
- Autoencoder(オートエンコーダー)は、積層オートエンコーダー(Stacked Autoencoder)や変分オートエンコーダー(Variational Autoencoder)など様々な種類がある
- Autoencoder(オートエンコーダー)によって、誤差が消失して精度が下がってしまったり、過学習を起こしづらくなり、精度が飛躍的に上がる
- Autoencoder(オートエンコーダー)は、異常検知や画像生成、文章生成などに利用されていること
- TensorflowやPytorchなど様々なライブラリで実装できる
- 実装の際は、初めは0から書くのではなく、TensorflowやPytorchなど様々なライブラリでを利用する
など、Autoencoder(オートエンコーダー)はさまざまな範囲で活用できますよね。ぜひ、Autoencoder(オートエンコーダー)を用いたディープラーニングを実装して、AI(人工知能)開発を始めましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。