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

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

ただいまの
回答率

91.03%

  • Python 3.x

    4071questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    480questions

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

  • Chainer

    94questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

ニューラルネットワークを使い「掛け算」の学習をしたい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 463

chainerを使って、ニューラルネットワークの勉強をしています。
先日はモデル・オプティマイザーの保存についてご教示いただきありがとうございました。

引き続き、色々調査しているのですが、単純な「掛け算」の学習ができずに困っています。

作成したデータは以下の通り。
・入力:4次元データ
・出力:入力の各次元の値を掛けただけのもの

入力が全て正の場合は、以下の通り、logとexpを組み合わせることで簡単に学習できました。

class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(4, 100),
            l2 = L.Linear(100, 1))

    def __call__(self, x, y):
        xv = Variable(x)
        yv = Variable(y)
        pr = self.predict(xv)
        return F.mean_squared_error(pr, yv)

    def predict(self, x):
        h0 = F.log(x)
        h1 = self.l1(h0)
        h2 = F.exp(self.l2(h1))
        return h2

しかし、入力に負の値が含まれている場合には、このやり方では学習できません。(logに0以下を入力できないので)
どんなネットワークを作れば学習できそうかを教えてください。

↓上手く学習できた時のコード↓

from chainer import Chain
from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils
import chainer.links as L
import chainer.functions as F
import numpy as np
import os


class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(4, 100),
            l2 = L.Linear(100, 1))

    def __call__(self, x, y):
        xv = Variable(x)
        yv = Variable(y)
        pr = self.predict(xv)
        return F.mean_squared_error(pr, yv)

    def predict(self, x):
        h0 = F.log(x)
        h1 = self.l1(h0)
        h2 = F.exp(self.l2(h1))
        return h2

# 全て正の値でサンプルデータを作る関数
# ノイズ無し
def createData__Positive_WithoutNoise(N):
    # 適当にデータを作って掛け算を学習してみる。
    # x1, x2, x3, x4が入力データ。
    # 期待する出力(教師)は単なる掛け算結果。
    x1 = np.linspace(1, 100, N).astype(np.float32)
    x2 = np.linspace(0.1, 10, N).astype(np.float32)
    x3 = np.linspace(0.1, 10, N).astype(np.float32)
    x4 = np.linspace(1, 100, N).astype(np.float32)
    np.random.shuffle(x2)
    np.random.shuffle(x3)
    np.random.shuffle(x4)
    return np.c_[x1, x2, x3, x4], np.c_[x1*x2*x3*x4]



N = 1500
NTest = 1200
batchSize = 10
xtrain, ytrain = createData__Positive_WithoutNoise(N)
xtest,  ytest  = createData__Positive_WithoutNoise(NTest)


# モデル作成
modelFileName = "kakezan4-model.npz"
if os.path.exists(modelFileName):
    model = MyChain()
    serializers.load_npz(modelFileName, model)
else:
    model = MyChain()

# optimizer作成
optimizer = optimizers.SMORMS3()
optimizer.setup(model)
optimizerFileName = "kakezan4-optimizer.npz"
if os.path.exists(optimizerFileName):
    serializers.load_npz(optimizerFileName, optimizer)

for epoch in range(10000):
    perm = np.random.permutation(N)
    for i in range(0, N, batchSize):
        x_batch = xtrain[perm[i:i + batchSize]]
        y_batch = ytrain[perm[i:i + batchSize]]

        model.zerograds()
        loss = model(x_batch, y_batch)
        loss.backward()
        optimizer.update()

    if 0 < epoch and epoch % 50 == 0:
        loss = model(xtest, ytest)
        serializers.save_npz(modelFileName, model)
        serializers.save_npz(optimizerFileName, optimizer)
        xtrain, ytrain = createData__Positive_WithoutNoise(N)
        xtest,  ytest  = createData__Positive_WithoutNoise(NTest)

        print("{}\t{}".format(epoch, loss.data))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

mkgreiさんの答えにヒントを得ていますが、入力値の符号を取り出して、答えの符号だけを目的関数とする学習器を別に用意させることで解決できそうです。

同一NNの各層に追加の符号学習専用の入力層、中間層、出力層を用意する、といいかえてもよいと思います。

<追記>
以下の記事が参考になると思います。
https://qiita.com/ta-ka/items/bcdfd2d9903146c51dcb
リンク先ページの削除されていると参考にできなくなるとおもいますので、コード部分のみ転記しておきます。(記載先の例で示されている学習率で十分かどうかは確認をお願いいたします。)

neuralnetwork.py

import numpy
import math
import random
from matplotlib import pyplot

class Neural:

    # constructor
    def __init__(self, n_input, n_hidden, n_output):
        self.hidden_weight = numpy.random.random_sample((n_hidden, n_input + 1))
        self.output_weight = numpy.random.random_sample((n_output, n_hidden + 1))
        self.hidden_momentum = numpy.zeros((n_hidden, n_input + 1))
        self.output_momentum = numpy.zeros((n_output, n_hidden + 1))


# public method
    def train(self, X, T, epsilon, mu, epoch):
        self.error = numpy.zeros(epoch)
        N = X.shape[0]
        for epo in range(epoch):
            for i in range(N):
                x = X[i, :]
                t = T[i, :]

                self.__update_weight(x, t, epsilon, mu)

            self.error[epo] = self.__calc_error(X, T)


    def predict(self, X):
        N = X.shape[0]
        C = numpy.zeros(N).astype('int')
        Y = numpy.zeros((N, X.shape[1]))
        for i in range(N):
            x = X[i, :]
            z, y = self.__forward(x)

            Y[i] = y
            C[i] = y.argmax()

        return (C, Y)


    def error_graph(self):
        pyplot.ylim(0.0, 2.0)
        pyplot.plot(numpy.arange(0, self.error.shape[0]), self.error)
        pyplot.show()


# private method
    def __sigmoid(self, arr):
        return numpy.vectorize(lambda x: 1.0 / (1.0 + math.exp(-x)))(arr)


    def __forward(self, x):
        # z: output in hidden layer, y: output in output layer
        z = self.__sigmoid(self.hidden_weight.dot(numpy.r_[numpy.array([1]), x]))
        y = self.__sigmoid(self.output_weight.dot(numpy.r_[numpy.array([1]), z]))

        return (z, y)

    def __update_weight(self, x, t, epsilon, mu):
        z, y = self.__forward(x)

        # update output_weight
        output_delta = (y - t) * y * (1.0 - y)
        _output_weight = self.output_weight
        self.output_weight -= epsilon * output_delta.reshape((-1, 1)) * numpy.r_[numpy.array([1]), z] - mu * self.output_momentum
        self.output_momentum = self.output_weight - _output_weight

        # update hidden_weight
        hidden_delta = (self.output_weight[:, 1:].T.dot(output_delta)) * z * (1.0 - z)
        _hidden_weight = self.hidden_weight
        self.hidden_weight -= epsilon * hidden_delta.reshape((-1, 1)) * numpy.r_[numpy.array([1]), x]
        self.hidden_momentum = self.hidden_weight - _hidden_weight


    def __calc_error(self, X, T):
        N = X.shape[0]
        err = 0.0
        for i in range(N):
            x = X[i, :]
            t = T[i, :]

            z, y = self.__forward(x)
            err += (y - t).dot((y - t).reshape((-1, 1))) / 2.0

        return err

main.py

from neuralnetwork import *

if __name__ == '__main__':

    X = numpy.array([[0, 0], [0, 1], [1, 0], [1, 1]])
    T = numpy.array([[1, 0], [0, 1], [0, 1], [1, 0]])
    N = X.shape[0] # number of data

    input_size = X.shape[1]
    hidden_size = 2
    output_size = 2
    epsilon = 0.1
    mu = 0.9
    epoch = 10000

    nn = Neural(input_size, hidden_size, output_size)
    nn.train(X, T, epsilon, mu, epoch)
    nn.error_graph()

    C, Y = nn.predict(X)

    for i in range(N):
        x = X[i, :]
        y = Y[i, :]
        c = C[i]

        print(x)
        print(y)
        print(c)
        print("")

追記2
手元で確認しましたら、2値入力の符号計算については、
epsilon = 0.1
mu = 0.5
で10000回で良好な結果が得られました。
[0 0][ 0.94077065  0.05854585]0
[0 1][ 0.05252437  0.94818359]1
[1 0][ 0.05249829  0.94820941]1
[1 1][ 0.94447755  0.05472062]0

追記3(2017/11/20 19:25)
上記は2値入力でしたので4値入力でうまくいくパターンを見つけましたので、追記しておきます。

既に不要かもしれませんが、完全な学習ができたハイパーパラメータを記載しておきます。

    X = numpy.array([[0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0],[0, 0, 1,1],  # 入力の記号:0がマイナス、1がプラス
                     [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1],
                     [1, 0, 0, 0], [1, 0, 0, 1], [1, 0, 1, 0], [1, 0, 1, 1],
                     [1, 1, 0, 0], [1, 1, 0, 1], [1, 1, 1, 0], [1, 1, 1, 1]])
    T = numpy.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0],  # 答えの符号:1個目が1ならプラス、
                     [0, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0],  #            2個目が1ならマイナス
                     [0, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0],
                     [1, 0, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [1, 0, 0, 0]])
    # X = numpy.array([[0, 0], [0, 1], [1, 0], [1, 1]])  # 入力の記号:0がマイナス、1がプラス
    # T = numpy.array([[1, 0], [0, 1], [0, 1], [1, 0]])  # 答えの符号:1個目が1ならプラス、2個目が1ならマイナス
    N = X.shape[0]  # number of data

    input_size = X.shape[1]
    hidden_size = 6     # 2
    output_size = 4     # 2
    epsilon = 0.3       # 0.1
    mu = 0.5            # 0.9
    epoch = 100000       # 10000


学習結果は以下となります。

[0 0 0 0][ 0.9946526   0.00533347  0.00283314  0.00259751]0
[0 0 0 1][  3.35769941e-03   9.96644302e-01   5.56622699e-04   6.70592964e-04]1
[0 0 1 0][  3.33927080e-03   9.96660884e-01   5.59857461e-04   6.70702223e-04]1
[0 0 1 1][  9.96596879e-01   3.40821671e-03   2.22956843e-04   3.25614771e-04]0
[0 1 0 0][  3.27048326e-03   9.96728618e-01   5.64677142e-04   6.74756067e-04]1
[0 1 0 1][  9.96570795e-01   3.43393502e-03   2.23697557e-04   3.26314940e-04]0
[0 1 1 0][  9.96504986e-01   3.49893558e-03   2.25097803e-04   3.27462076e-04]0
[0 1 1 1][  5.66155206e-03   9.94335298e-01   9.34340392e-05   9.24230822e-05]1
[1 0 0 0][  3.31009107e-03   9.96690587e-01   5.56904682e-04   6.68238304e-04]1
[1 0 0 1][  9.96573108e-01   3.43220946e-03   2.22530928e-04   3.25064048e-04]0
[1 0 1 0][  9.96511494e-01   3.49322967e-03   2.23526919e-04   3.25795278e-04]0
[1 0 1 1][  5.66332128e-03   9.94333992e-01   9.32042942e-05   9.22570059e-05]1
[1 1 0 0][  9.96481951e-01   3.52230033e-03   2.24429722e-04   3.26645683e-04]0
[1 1 0 1][  5.66085770e-03   9.94336166e-01   9.33024233e-05   9.23137346e-05]1
[1 1 1 0][  5.65317314e-03   9.94343241e-01   9.34888288e-05   9.24102042e-05]1
[1 1 1 1][  9.91126091e-01   8.87614458e-03   2.20889172e-05   2.87712893e-05]0

mkgreiさんとのコメント欄でのやり取りで、興味がでたので、XNORを出力するMLPの重み付けパラメータの一例を記載しておきます。

入力層+隠れ層(一層)+出力層の形での解の一例示です。

<イメージ図>(※注:\はバックスラッシュ)
入力層 隠れ層 出力層
     (w11)
 x1  ―  ― h1
(w21)\  /    \(v1)
      X    o1
(w12)/  \    /(v2)
 x2  ―  ― h2
    (w22)

h1 = f(w11 * x1 + w12 * x2 + b1)
h2 = f(w12 * x1 + w22 * x2 + b2)
o1 = f(v1 * h1 + v2 * h2 + b3)

fはシグモイド関数です。上記の形でMLPを表すことができます。

このときにXORを実現するパラメータの組み合わせは以下です。

w11 = 2
w12 = 2
w21 = -2
w22 = -2
b1  = -1
b2  = 3
v1  = -2
v2  = -2
b3  = 3

ここに負数があるのでreluではだめなんでしょうね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/17 19:30

    符号は論理回路になるので学習が大変です。
    なかなかの挑戦になるかも。
    教師データのバランスが重要らしい。
    https://qiita.com/KUKDfhia/items/3732bc3542a0bf7802d5

    キャンセル

  • 2017/11/19 00:31

    掛け算の符号のみの判定はXNORの学習器と等価になります。
    もともと、単純パーセプトロンでは、XORが学習できないという批判を学者さんにされて、その解決策としてDNNが登場したものの、勾配消失による学習不良で、DNNは冬の時代に突入したけれど、バックプロパゲーションでそれをのりこえてDNNブームが起きたと認識しています。
    なので、XNORもDNNなら学習可能、という風に理解しています。

    http://okoysm.hatenablog.jp/entry/2017/01/26/081849#パーセプトロンの限界

    XNORとしては、FPGA化まわりとか、バイナリNetとか周りでは別の思惑(高速化や省電力化)があって、そこはそこで熱いのですが、今回のケースではお勉強目的のようですから、上記の追記と記事が参考になると思います。

    キャンセル

  • 2017/11/20 16:18

    大変参考になりました。
    確かに学習できますね。

    ところで、sigmoidを活性化関数にすると学習できるのに対して、reluだといけない直感的な理由というのはあるのでしょうか?
    ざっと試してみると、reluではうまく学習できませんでした。
    パラメータチューニングが足りていないだけでしょうか?

    キャンセル

  • 2017/11/20 18:55

    追記
    隠れ層2に2ニューロンずつにすると、活性化関数がsigmoidの時に、重みの初期化次第で変なところに収束することがあるようです。
    重み初期化の乱数をかえると、多くの場合には正しく学習できるようです。

    Dropout層を入れると安定するのかもしれません。

    キャンセル

  • 2017/11/20 19:32

    reluでうまくいかない直感的な理由はわかりません。
    sigmoidでもパラメータチューニングは必要でしたので、同様の可能性はあると思います。

    キャンセル

  • 2017/11/20 20:06

    reluの勾配が定数であることに問題があると妄想していましたが、あまり明確でないかもしれないですね。

    キャンセル

  • 2017/11/26 17:01 編集

    いろいろと調べてみて、直感的にreluだと駄目な理由に思いいたりました。xが負の領域で解が0になるため、学習が正しく進まないのだろう、と想像しています。

    キャンセル

  • 2017/11/26 22:40

    reluだけではなく、hard_sigmoidも併せてみたらどうなるでしょうか。。
    http://docs.chainer.org/en/stable/reference/generated/chainer.functions.hard_sigmoid.html#chainer.functions.hard_sigmoid

    キャンセル

  • 2017/11/27 10:17

    今、chainerが手元に無いので確認ができないのですが関数系を見る限りでは直感的にhard-sigmoidsでもうまくいくと思います。
    学習がうまくいくハイパーパラメータの提示もおわっておりますので、なぜhard-sigmoidsを合わせてみたいのか?という動機をおしえていただけますか?

    キャンセル

  • 2017/11/28 20:20

    たしかにおっしゃる通りな気がします。
    中間層の数と活性化関数次第で、XORを表現できるかどうかの境目なのですね。
    余裕を持たせることが重要な気がしてます。
    おもしろいですね。

    キャンセル

  • 2017/12/02 15:59

    失礼しました。確かにハイパーパラメータを提示していただいておりますので
    hard sigmoidは必要ありませんでしたね。

    本当に長い時間、お付き合いいただきありがとうございました

    キャンセル

0

入力に対して、符号は機械的に処理してしまうのはいけませんか?
そうすれば、入力をすべて正にすることが可能に…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/17 21:07

    ありがとうございます。
    仰る通りだとは思いますが、あくまで機械学習のお勉強の例題として掛け算を設定していますので、
    出来れば、機械学習っぽいやり方を模索しています。

    単に掛け算するだけなら、普通にかければいいので・・・

    キャンセル

  • 2017/11/20 16:35

    たしかにおっしゃるとおりですね。
    今は掛け算なので、事前に符号と大きさとを分離して考えることができるとわかっていますが。
    指数にすると、掛け算が線形になることも利用していて。
    どこまで事前情報を利用してよいのか混乱しました。

    何がともあれ、すごくおもしろい問題設定だと思っています。
    いろいろと考えさせられました。

    ネット上でもっと複雑であるが、おもしろそうな結果が出る例題が多く、基礎的なところがおろそかでした。

    キャンセル

0

mkgrei様、yag1kaz様、回答ありがとうございます。
ひとまず、yag1kaz様の助言を参考にして、符号のみを学習させるように適当な
ネットワークを組んでみました。

softmax_cross_entropyを利用すれば、かなりの精度で符号学習ができることをつかみました。
一方、mean_squared_errorでは、あまり精度が良くないようです。
引き続き、調査をしていきます。

class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1 = L.Linear(4, 100),
            l2 = L.Linear(100, 100),
            # softmax_cross_entropyを使う場合は、↓
            # l3 = L.Linear(100, 3))

            # mean_squared_errorを使う場合は、↓
            l3 = L.Linear(100, 1))

    def __call__(self, x, y):
        pr = self.predict(x)
        yv = Variable(y)
        # softmax_cross_entropyで正しく学習できた。
        #return F.softmax_cross_entropy(pr, yv)
        return F.mean_squared_error(pr, yv)

    def predict(self, x):
        h1 = F.hard_sigmoid( self.l1(x) )
        h2 = self.l2(h1)
        h3 = self.l3(h2)
        return h3

# 正負両方の値でサンプルデータを作る関数
def createData__PositiveNegative_WithoutNoise(N):
    # 適当にデータを作って掛け算を学習してみる。
    # x1, x2, x3, x4が入力データ。
    # 期待する出力(教師)は単なる掛け算結果。
    x1 = np.linspace(-1, 100, N).astype(np.float32)
    x2 = np.linspace(-0.1, 10, N).astype(np.float32)
    x3 = np.linspace(-10, 0.1, N).astype(np.float32)
    x4 = []

    for i in range(N):
        x4.append( i % 11 )

    x4 = np.array(x4, dtype=np.float32)

    np.random.shuffle(x2)
    np.random.shuffle(x3)
    np.random.shuffle(x4)

    y = np.sign(x1*x2*x3*x4)

    # softmax_cross_entropyを使う場合は、↓
    # return np.c_[x1, x2, x3, x4], np.array(y).astype(np.int32)

    # mean_squared_errorを使う場合は、↓
    return np.c_[x1, x2, x3, x4], np.c_[ np.array(y).astype(np.float32) ]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 18:31 編集

    MSEでも答えが正か負かはわかりますね。(訂正後)
    規格化とかはできないので、1と-1の近くでブレがありますが。

    活性化関数にreluを使うと、中間層のニューロンの数を2にすると調子が悪いようです。
    10とかに増やすと学習できるようになりました。(ただ疑問も…)

    さらに、このモデルについてですが、Xに対して、signを予め取っておかないと、学習データの外の数字に対して安定して符号判定できないかもしれません。
    例えば、x1=1000とか。

    以下、混乱中
    中間層を増やしすぎると学習しているのか過学習しているのか判別がつきませんが…
    最初にsignを取ってしまうと、全パターンを学習器にみせてしまうので、中間層を十分増やせば、教師データに完全学習して精度100%。
    そもそも論理回路の入力対出力を学習する場合過学習とかいう概念はないのだろうか。(そんなにパターンがないし)

    キャンセル

  • 2017/11/20 19:39

    過学習については今回は考えなくてもよいと思います。
    なぜならXOR(XNOR)の論理回路がそもそも非線形出力を期待しているので、過学習しないと正解を出力できないからです。
    また、回答パターンの組み合わせも16個の組み合わせしかないので、訓練データセットにテストデータセットがすぐに包含されてしまいます。

    突き詰めると、最初から正解を提出できる重みをニューロンに指定するだけでよい、ということになってしまい、mkgreiさんの最初のご回答にきわめて近い状態、ということになってしまうのですが、今回はプロセスが大事という事で。

    キャンセル

  • 2017/11/20 20:11

    なるほど、ごもっともですね。
    いろんなことがごちゃまぜになって混乱していました。

    単層のネットワークでは関数系としてそもそもXORを表現できなかったことに対して、多層にすると学習できるようになるというのがポイントだったんですね。

    スッキリしました。
    ありがとうございます。

    キャンセル

0

すいません、yag1kaz様よりコードをいただいていたことを見落としていました。
ちょっと確認します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/25 19:09

    回答に追記を行っていますので、ご確認下さい。

    キャンセル

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4071questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • 機械学習

    480questions

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

  • Chainer

    94questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。