Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ホワイトノイズを使って機械学習されたモデルを推定する

More than 3 years have passed since last update.

概要

機械学習の課題では、入出力からモデルを作成し、出力を推定することが目的となることが多くあります。例えば、下記のように花が描かれている絵を入力として与えたときに、それが花であるという出力を出すモデルを作ったりします。

一方で、自然界などではすでにモデルが存在しており、そのモデルを深く調査したいというケースが存在します。例えば花を見たときに、それが花だと認識できる脳の仕組みを調べたいケースなどです。

  • 出力を推定したいケース(前者)の例
    • 画像を入力としたときに、映っているものを知りたい
    • 音声を入力としたときに、別の言語ではどのように表現されるかを知りたい
    • 過去の株価データを入力したときに、将来の株価データが知りたい
  • モデルを推定したいケース(後者)の例
    • 人間が花を見たときになぜ花だとわかるのか、脳の仕組みを知りたい
    • 工場の機械が想定通りに動作しているのか知りたい
    • 開発したデバイスが理論通りの動作をしているのかを知りたい

今回は、後者のモデルを推定する方法を試してみました。
手順として、
1. 推定するためのモデルを作成する
2. ホワイトノイズをモデルに入力し、入出力のマッピングを行い、モデルを推定する
3. 推定されたモデルと、1で作成したモデルを比較する
という流れを行います。

推定されるモデルを作成する

今回はTensorFlowの手書き文字チュートリアルMNIST For ML Beginnersのモデルを使用しました。このモデルは線形・非線形の処理を組み合わせた比較的シンプルな下記のようなモデルです。

image
(TensorFlowのページより転載)

TensorFlowチュートリアルをそのまま使用し、上記モデルを作成しました。

このモデルは、手書き文字を入力した時にその文字が0-9のどれに対応するかを推定します。

ホワイトノイズをモデルに入力し、入出力のマッピングを行い、モデルを推定する

上記モデルの重み付けパラメータWを推定したいと思います。
モデルの仕組みが全くわからない場合、どのような入力を与えたときに適切な出力が得られるのかがわかりません。そのため、ランダムな値を与えたときの出力を多数積み重ねる事によりモデルを推定します。

たとえば、下記入力のようなホワイトノイズを与えたときに、モデルがどのように応答するかを何度も試します。

次に、y = Wxというシンプルなモデルを記述し、実際のシステムにホワイトノイズを入力した際の入出力を使ってWの重み付けを行います。

以下のような感じです。

import numpy as np

input_vector_size = 28 * 28
output_vectors = np.zeros((input_vector_size, 10))

for i in range (10000):
    if i % 1000 == 0:
        print("in progress... [%d]" % i)
    # ホワイトノイズの作成
    noise= np.random.randn(input_vector_size)
    # 未知のモデルに対してホワイトノイズを入力し、出力を得る
    result = y.eval(feed_dict={x: [noise]})
    index = np.argmax(result)
    # モデルが選択した出力に正の重み付けを、選択しなかった出力に負の重み付けをする
    for i in range(10):
        if (i==index):
            output_vectors[:,i] += noise * 0.9
        else:
            output_vectors[:,i] -= noise * 0.1

10000試行繰り返したあとの、重み付け関数W(上記コードだとoutput_vectors)は以下のようになりました。左上が手書き文字1に対応した関数で、以降2,3...と続きます。

fig = plt.figure(figsize=(10, 4))
for i in range(10):
    ax = fig.add_subplot(2, 5, i + 1)
    ax.imshow(output_vectors[:,i].reshape([28, 28]), cmap="seismic")

image

推定されたモデルと、1で作成した正解モデルを比較する

TensorFlowチュートリアルを使って作成されたモデルは以下のようになっていました。

image

見た目で比較するとなかなか良く推定できているのではないでしょうか。
試行を10000から100000に増やすと、より近くなります。

ホワイトノイズを100000回入れた場合
image

まとめ

上記のように、単純な線形モデルを仮定しただけでも、内部関数を推定・記述することができました。今後はより非線形なモデルに対して線形モデルだけでどの程度記述できるか・非線形をアプリオリでない形で組み込むにはどうすればよいのか等も試してみたいと思います。

補遺

制御工学等で使用されるインパルス応答の分析はこの手法と同様の手法です。

また、神経科学・認知科学分野でもreverse correlationと呼ばれる手法で神経細胞のモデル化等に使用されています。
Reverse correlation in neurophysiology
受容野の定量的測定法

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away