2016.10.13
Sparse Codingについて
こんにちは、次世代システム研究室のA.Zです。今回はsparse codingについて紹介したいと思います。
Sparse Codingとは
Sparse codingはFeature Engineeringの一つの手法です。Sparse codingは、入力データ(ベクトル)を複数基底の組み合わせに変換します。
この基底の組み合わせの次元数は入力データーの次元より多く、かつほとんどの基底は0になり、少ない数の基底のみ0ではありません(Sparse)。
Sparse codingは以下の方程式(方程式 1)で表すことできます。
- x : 入力データ
- a : 係数。こちらの係数はほとんど0になる(Sparse)。
- Φ : 基底ベクトルまたは辞書
Sparse coding コンセプトは、人間の脳のシステムの仕組みから生まれたコンセプトです。
人間の脳は、たくさんのneuronから構成されます。しかし、特定情報に対して有効になるのは、こちらのneuronのnetworkの中の少数です。
つまり、人間の脳の中で、情報はsparseでコードされます。
Sparse codingの特徴は入力データの次元を増やすことです。こちらは、他のfeature engineering、principal component analysis (PCA)と違うポイントです。入力データの次元を増やしかつsparseな表現とした結果、sparse codingはハイレベル featureを表現することができます。
Sparse Codingの学習
方程式 1 を解くために、以下のコストファンクションをSparse Codingに学習させます。
以上の数式の前半部分は、入力データと再構築したデータの誤差を表します。後半の部分は、sparse性をコントロールするパラメーターを表します。λは、誤差とsparse性のバランスをコントロールするパラメーターです。S(a)は、sparsityコストファンクション(a が0より大きいければ大きいほどpenaltyを大きくするファンクション)を表します。
Sparse Codingの応用
Sparse codingは、feature engineeringの手法として様々な分野で応用されます。
以下は、いくつかの応用の例です。
画像のノイズ削除
学習済みの辞書(基底ベクトル)を利用し、画像からのノイズを削除します。
[ELAD06] Elad.M, et.al. “Image Denoising Via Sparse and Redundant Representations Over Learned Dictionaries”, IEEE Transactions on Image Processing, Vol. 15, No. 12,2006
画像の再構築
学習済みの辞書(基底ベクトル)を利用し、文字とテキストが混在する画像の中からテキストを取り除きます。
[Mairal09] Mairal, Julien, et al. “Online dictionary learning for sparse coding.” Proceedings of the 26th annual international conference on machine learning. ACM, 2009.
画像分類 (Image Classification)
sparse codingでfeature抽出を行い、その結果をclassifier モデルにインプットデーターとして利用します。
以下は、sparse codingを利用したMNIST画像分類の結果です。
上記の結果から、sparse coding利用した手法は、CNNより良いことがわかります。
参考:K.Yu, Y. Lin, J. Lafferty, “Learning Image Representation from The Pixel Level Via Hierarchical Sparse Coding”, Computer Vision and Pattern Recognition ,2011
Sparse codingの実践例
実際にSparse codingを利用し、画像のノイズ削除する例を紹介します。
今回利用したライブラリーや言語は以下です。
- python 3.5
- sklearn package(Sparse coding実装されているパッケージ)
こちらの処理は、以下のステップで行います。
1. 画像から学習し、辞書を作成します
辞書の学習は、以下のコード利用します。
dico = MiniBatchDictionaryLearning(n_components=500, alpha=1, n_iter=1000,transform_algorithm = 'lasso_lars', transform_alpha=1.0, fit_algorithm = 'lars') V = dico.fit(data).components_
学習した辞書のデータは、以下の通りです。
2. 画像のノイズ化
今回利用するノイズ画像は、以下になります。
3. ノイズ画像から、画像の修復
辞書の学習が終わったら、以下のコードーを利用し、Sparse codingで画像のノイズを削除します。
# extract patch from image data = extract_patches_2d(distorted[:, width // 2 :], patch_size) data = data.reshape(data.shape[0], -1) intercept = np.mean(data, axis=0) data -= intercept reconstruction={} reconstruction['1'] = face.copy() #sparse coding transform coder = SparseCoder(dictionary=V, transform_algorithm='omp', transform_n_nonzero_coefs=2) code = coder.transform(data) patches = np.dot(code, V) #apply patch to remove noise patches += intercept patches = patches.reshape(len(data), *patch_size) reconstruction['1'][:,width // 2:] = reconstruct_from_patches_2d( patches, (height, width // 2)) dt = time() - t0 print('done in %.2fs.' % dt) show_with_diff(reconstruction['1'], distorted, ' (time: %.1fs)' % dt) plt.show()
ノイズ削除した画像は、以下の図の右側です。
以上の結果から、ノイズが減ることを確認できました。ファインチューニング(パラメーター調整、sparse codingアルゴリズム変更など)で、さらに良い結果が得られるのではないかと思います。
まとめ
今回はsparse codingの基本、応用例、または簡単な実践例を紹介しました。
Feature engineering手法として、Sparse codingは幅広い分野で応用できるのではないかと思います。
今後、さらなる応用または実践例を紹介したいと思います。
最後に
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD