質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1851閲覧

機械学習:単純パーセプトロンの誤り訂正学習法について

kokosei

総合スコア13

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/18 04:29

編集2018/03/19 22:21

下記コードの①、②、③について質問させてください

①:何をやっているのかよく分かりません。解説していただけないでしょうか?

②:なぜ初期化する必要があるのでしょうか?

③:誤り訂正学習法のバイアスbについて、修正分「Δb = -(t-y)」と公式に書いてあったのですが、なぜマイナスが付いていないのでしょうか?

--

2種類の正規分布に従うデータの分類を考える。
ニューロンが発火しないデータは平均値が0、発火するデータは平均値が5とし、それぞれ10ずつデータがある。
このデータを生成するコードは以下。

Python

1import numpy as np 2 3rng = np.random.RandomState(123) 4d = 2 # データの次元 5N = 10 # 各パターンのデータ数 6mean = 5 # ニューロンが発火するデータの平均値 7 8//9x1 = rng.randn(N,d) + np.array([0,0]) 10x2 = rng.randn(N,d) + np.array([mean, mean]) 11 12x = np.concatenate((x1,x2), axis = 0) 13 14//15w = np.zeros(d) 16b = 0 17 18def y(x): 19 return step(np.dot(w,x) + b) 20 21def step(x): 22 return 1 * (x > 0) 23 24def t(i): 25 if i < N: 26 return 0 27 else: 28 return 1 29 30while True: 31 classified = True 32 for i in range(N * 2): 33 delta_w = (t(i) - y(x[i])) * x[i] 34 //35 delta_b = (t(i) - y(x[i])) 36 w += delta_w 37 b += delta_b 38 classified *= all(delta_w == 0) * (delta_b == 0) 39 if classified: 40 break

散布図

イメージ説明

各グループの実体

イメージ説明

引用元

http://amzn.asia/8HQlyS7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bassbone

2018/03/18 09:00

質問文のコードはどこから持ってきたものでしょうか?そうであれば引用元を教えていただけると助かります。
bassbone

2018/03/18 10:07 編集

引用元ありがとうございます。質問文にも記載しておくといいかと。
kokosei

2018/03/18 22:23

かしこまりました。ご助言感謝いたします。
guest

回答2

0

①について
これは、識別対象のサンプルデータを生成しているコードです。x1とx2を生成したのちに以下のコードを実行すると、識別対象のデータがどのような状態になっているのかわかります。

python

1import matplotlib.pyplot as plt 2plt.scatter(x1[0:,0],x1[0:,1],label='x1') 3plt.scatter(x2[0:,0],x2[0:,1],label='x2') 4plt.legend() 5plt.show()

②について
あとで、w += delta_w b += delta_b のコードがあります。これを行うにはあらかじめ
wとbが定義されている必要があります。初期化はこの定義の意味合いがあります。

③について
すいません。学んだのが昔のことでうまい説明がわかり次第、後で追記します。
とりあえず「Δb = -(t-y)」の通りの実装をするためには、関数y(x)が

python

1def y(x): 2 return step(np.dot(w,x) - b) 3

とバイアスを加算する式から減算する式になっていれば、マイナス符合付きの計算式に③はなります。もともと、バイアスはウェイト付きの計算結果がバイアスよりも大きいときに1とし、そうでなければ0とする閾値のようなものなので上記のような引き算の形であらわして0より大きいか否かで判別する形式のほうが「Δb = -(t-y)」となる理由がわかりやすいのではないでしょうか。

すいません。今はここまでです。

投稿2018/03/18 17:07

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokosei

2018/03/18 22:43

コメントありがとうございます。③がやっぱり分からないですね。。バイアスが閾値で、tとyに差がある場合調整するもの、というのは分かるのですが。
R.Shigemori

2018/03/19 14:44

改めて眺めてみましたが、修正分「Δb = -(t-y)」におけるt-yは、誤りがあった場合だけ修正することを計算式で表したものです。これは、tは本来のクラス(0または1)であり、yは関数yで示されるようにやはり0または1が出力されるため、t=0 and y=1の場合とt=1 and y=0の場合だけバイアスbを修正することを意味しています。(同値の場合、t-yは0になるためΔb=0となり訂正されない) よってこのΔb = -(t-y)は、t=0 and y=1のときバイアスに1加算し、t=1 and y=0のとき、バイアスから1減算するということを意味しています。 クラス0とクラス1を識別する1次関数は、np.dot(w,x) = bによって本来はあらわされます。この結果に基づき、np.dot(w,x) > bのときy=1が出力され、np.dot(w,x) <= bのときy=0が出力されるのでこの関係をもとに本来は0のときにnp.dot(w,x) > bとなっている場合にbに1加算し、その反対の時はbから1減算するというバイアスの訂正がなされます。 しかしながら、これは、境界線がnp.dot(w,x) = bのときに成立するものです。つまり、これを式変形してfunc=np.dot(w,x) - bとなるときにΔb = -(t-y)が成立します。しかしながら、実装されている関数はnp.dot(w,x)+bとなっています。これは式変形すると、np.dot(w,x) = -bとなるので、バイアスの変更する正負は、先のものと反対になります。
kokosei

2018/03/19 22:49

考えてくださりありがとうございます。いただいたコメントを自分も考えたうえで、お返事させていただければと思います。
guest

0

ベストアンサー

①:何をやっているのかよく分かりません。解説していただけないでしょうか?

x1 = rng.randn(N,d) + np.array([0,0]) x2 = rng.randn(N,d) + np.array([mean, mean]) x = np.concatenate((x1,x2), axis = 0) def t(i): if i < N: return 0 else: return 1

データを生成しています。初項がノイズ、2項目が平均値です。
x = [x1[0], x1[1], ..., x1[9], x2[0], ..., x2[9]]
になります。
ノイズは標準正規分布です。
https://algorithm.joho.info/programming/python-numpy-random-randn/

ちょっと悲劇的なコードであまり真似しないほうがいいです。
tという関数の代わりに、

t = np.zeros(N*2) t[N:] = 1

の方がいいと思います。


②:なぜ初期化する必要があるのでしょうか?

初期値が必要だからです。
ないと値がない状態では、引き算ができません。

ここからわかることは、学習したモデルは初期値に「ゆるく」依存することです。
今はオールゼロにしていますが、乱数で生成することもあります。
値が大きすぎるとオーバーフローして更新ができなくなってしまうので、係数の数で規格化することが多いと思います。


③:誤り訂正学習法のバイアスbについて、修正分「Δb = -(t-y)」と公式に書いてあったのですが、なぜマイナスが付いていないのでしょうか?

https://book.mynavi.jp/manatee/detail/id=75803
これですよね。公式の方が誤植な気がします。
意味も考えると-(y-t)が正しいです。

英語のサイト。
https://theclevermachine.wordpress.com/2014/09/06/derivation-error-backpropagation-gradient-descent-for-neural-networks/
wとbで係数が同じであることがわかるかと思います。
多変数関数の偏微分がわかればすぐに分かるのですが、ニューラルネットワーク勉強用のもっとわかりやすい説明があるかもしれません。

追記:
これがわかりやすいのかは人によるかと思いますが、いろいろと途中結果を追っている様子。
https://qiita.com/supersaiakujin/items/3c71c6572dc3036edab1

投稿2018/03/18 16:17

編集2018/03/18 16:24
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokosei

2018/03/18 22:21

コメントありがとうございます。追加で2点質問させていただけませんでしょうか。①の「初項がノイズ、2項目が平均値です。」について、(1)ノイズとは何か(調べたのですが分かりませんでした)、(2)ノイズに平均値を足すとなぜデータが生成できるのか、です。②はよく分かりました。③はご紹介いただいたリンク先のページをよく読んでみたいと思います。
mkgrei

2018/03/19 02:15

今分類問題を学習しようとしています。 学習する問題は、「観測データ」にばらつきがあるようなものです。 例えば、本当の値は0と5ですが、我々がサンプルしてこれるのは、 0のクラスに属するものはある時は0.3、あるときは-0.5、 5のクラスの属するものはある時は5.7、あるときは4.8、 という具合です。 これが今の簡易化された練習問題です。 ノイズというのは問題の設定に付随するものです。 これがないような分類問題、例えばいつ見ても0か5が観測される問題の場合、機械学習するモチベーションがありません。 この問題はとことん人工的なデータを作っているので、ピンと来ないかもしれませんが、 https://qiita.com/Amtkxa/items/61d4316324c66b766ddf このような現実的な問題で考えてみるとわかりやすいと思います。 花の品種の分類で、例えば花弁のサイズには個体にばらつきがあるなど。
kokosei

2018/03/19 12:58

参考ページありがとうございます。リンク先のものも本エントリのものも、やろうとしていることは分かるのですが、下記2つの式がなぜそれぞれのグループを作るのかがやっぱり分からないですね。。 x1 = rng.randn(N,d) + np.array([0,0]) x2 = rng.randn(N,d) + np.array([mean, mean]) 平均が0と5のd次元のデータをN個ずつ持つグループが、↑の変数でそれぞれ表せるということが分かりません。プラスするっていうのがどうしてなのか。。よく考えてみます。
mkgrei

2018/03/19 14:22

rng.randn(N,d) + np.array([0,0]) = np.array([rng.randn(1,d) + np.array([0,0]), rng.randn(1,d) + np.array([0,0]), ...]) 次元がずれているのに、ということでしょうか? print(rng.randn(N,d)) print(rng.randn(N,d) + np.array([mean, mean])) してみるとわかりやすいのかもしれません。
kokosei

2018/03/19 22:32 編集

おっしゃる通りprint関数で書いてみたら分かりました!本文に「各グループの実体」を追記したのですが、22行目の配列に23行目の配列を足すとどうなるかが分かっていませんでした。それぞれの要素に[5,5]を足すということですよね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問