<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tensorflow | DL FreeTime</title>
	<atom:link href="https://www.ct-innovation.blog/dl-freetime/tag/tensorflow/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.ct-innovation.blog/dl-freetime</link>
	<description>Start studying deep learning in my Free time</description>
	<lastBuildDate>Mon, 13 May 2024 08:27:03 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.ct-innovation.blog/dl-freetime/wp-content/uploads/2024/02/cropped-cooltext289278806579247-32x32.png</url>
	<title>Tensorflow | DL FreeTime</title>
	<link>https://www.ct-innovation.blog/dl-freetime</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>ニューラルネットワーク: AIの基礎となる技術を解説</title>
		<link>https://www.ct-innovation.blog/dl-freetime/programming/python/2790/</link>
					<comments>https://www.ct-innovation.blog/dl-freetime/programming/python/2790/#respond</comments>
		
		<dc:creator><![CDATA[Yuki]]></dc:creator>
		<pubDate>Mon, 27 May 2024 16:07:09 +0000</pubDate>
				<category><![CDATA[AI/MachineLearning]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[PyTorch]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Keras]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[Tensorflow]]></category>
		<guid isPermaLink="false">https://www.ct-innovation.blog/dl-freetime/?p=2790</guid>

					<description><![CDATA[ニューラルネットワークは、人工知能（AI）の根幹をなす技術の一つです。近年、機械学習や深層学習の発展に伴い、ニューラルネットワークはますます注目を集めています。本記事では、ニューラルネットワークの基本概念から歴史、数式、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ニューラルネットワークは、人工知能（AI）の根幹をなす技術の一つです。近年、機械学習や深層学習の発展に伴い、ニューラルネットワークはますます注目を集めています。本記事では、ニューラルネットワークの基本概念から歴史、数式、Pythonでの実装例まで、わかりやすく解説していきます。</p>



<h2 class="wp-block-heading">ニューラルネットワークとは</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/1/10/Blausen_0657_MultipolarNeuron.png" alt="" style="object-fit:contain;width:350px;height:200px"/></figure>
<cite><a rel="nofollow noopener" target="_blank" href="https://commons.wikimedia.org/wiki/File:Blausen_0657_MultipolarNeuron.png">Wikimedia Commons MultipolarNeuron</a></cite></blockquote>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-image size-large is-resized"><img decoding="async" src="https://upload.wikimedia.org/wikipedia/commons/7/7d/Artificial_neuron-2.gif" alt="" style="object-fit:contain;width:350px;height:200px"/></figure>
<cite><a rel="nofollow noopener" target="_blank" href="https://commons.wikimedia.org/wiki/File:Artificial_neuron-2.gif">Wikimedia Commons Artificial neuron-2</a></cite></blockquote>
</div>
</div>



<p class="wp-block-paragraph">ニューラルネットワークは、人間の脳内にある神経細胞（ニューロン）のネットワークを数学的にモデル化したものです。複数の層（入力層、隠れ層、出力層）から構成され、各層のニューロン間が重みづけされた接続で結ばれています。この構造により、ニューラルネットワークは複雑な関数を学習し、パターン認識や予測などのタスクを実行できます。</p>



<h2 class="wp-block-heading">ニューラルネットワークの構成要素</h2>



<p class="wp-block-paragraph">ニューラルネットワークは、複数の層から構成されています。各層の役割と特徴について、詳しく見ていきましょう。</p>



<h3 class="wp-block-heading">入力層</h3>



<p class="wp-block-paragraph">入力層は、ニューラルネットワークにデータを入力する役割を担っています。入力層のニューロンの数は、入力データの次元数に対応します。例えば、28&#215;28ピクセルの画像を入力する場合、入力層のニューロンの数は784（=28&#215;28）になります。</p>



<h3 class="wp-block-heading">隠れ層</h3>



<p class="wp-block-paragraph">隠れ層は、入力層と出力層の間に位置する層です。隠れ層のニューロンは、入力層からの信号を受け取り、非線形変換を施して、出力層に信号を送ります。隠れ層の数とニューロンの数は、タスクの複雑さや用いるデータの特性に応じて設定します。</p>



<p class="wp-block-paragraph">隠れ層で用いられる活性化関数は、非線形性を導入するために重要な役割を果たします。代表的な活性化関数として、以下のようなものがあります。</p>



<ul class="wp-block-list">
<li>シグモイド関数：\(f(x) = \frac{1}{1 + e^{-x}}\)</li>



<li>tanh関数：\(f(x) = \frac{e^x &#8211; e^{-x}}{e^x + e^{-x}}\)</li>



<li>ReLU（Rectified Linear Unit）関数：\(f(x) = \max(0, x)\)</li>
</ul>



<p class="wp-block-paragraph">近年、ReLU関数が広く用いられています。ReLU関数は、勾配消失問題を緩和し、ニューラルネットワークの学習を高速化するという利点があります。</p>



<h3 class="wp-block-heading">出力層</h3>



<p class="wp-block-paragraph">出力層は、ニューラルネットワークの最終層であり、タスクに応じた出力を生成します。出力層のニューロンの数は、タスクの種類によって異なります。例えば、二値分類のタスクでは、出力層のニューロンの数は1になります。多クラス分類のタスクでは、出力層のニューロンの数はクラスの数に対応します。</p>



<p class="wp-block-paragraph">出力層で用いられる活性化関数は、タスクの種類によって異なります。二値分類では、シグモイド関数が用いられることが多いです。多クラス分類では、ソフトマックス関数が用いられることが多いです。ソフトマックス関数は、出力を確率分布に変換します。</p>



<h2 class="wp-block-heading">ニューラルネットワークの学習</h2>



<p class="wp-block-paragraph">ニューラルネットワークの学習は、教師あり学習の一種です。教師データ（入力データとそれに対応する正解ラベル）を用いて、ニューラルネットワークのパラメータ（重みとバイアス）を調整します。学習の目的は、教師データに対する予測誤差を最小化することです。</p>



<h3 class="wp-block-heading">誤差関数</h3>



<p class="wp-block-paragraph">ニューラルネットワークの学習では、予測値と正解ラベルの差を定量化する誤差関数を定義します。代表的な誤差関数として、以下のようなものがあります。</p>



<ul class="wp-block-list">
<li>平均二乗誤差（Mean Squared Error, MSE）：\(E = \frac{1}{2N}\sum_{i=1}^N(y_i &#8211; t_i)^2\)</li>



<li>クロスエントロピー誤差（Cross Entropy Error）：\(E = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^Kt_{ik}\log y_{ik}\)</li>
</ul>



<p class="wp-block-paragraph">ここで、\(N\)はデータの数、\(y_i\)は予測値、\(t_i\)は正解ラベル、\(K\)はクラスの数です。</p>



<h3 class="wp-block-heading">最適化アルゴリズム</h3>



<p class="wp-block-paragraph">ニューラルネットワークの学習では、誤差関数を最小化するためのパラメータ更新を行います。パラメータ更新には、最適化アルゴリズムを用います。代表的な最適化アルゴリズムとして、以下のようなものがあります。</p>



<ul class="wp-block-list">
<li>確率的勾配降下法（Stochastic Gradient Descent, SGD）</li>



<li>モーメンタム法（Momentum）</li>



<li>AdaGrad（Adaptive Gradient）</li>



<li>Adam（Adaptive Moment Estimation）</li>
</ul>



<p class="wp-block-paragraph">これらの最適化アルゴリズムは、勾配降下法をベースとしながら、学習率の適応的な調整や、パラメータ更新の加速などの工夫を取り入れています。</p>



<h3 class="wp-block-heading">過学習の防止</h3>



<p class="wp-block-paragraph">ニューラルネットワークは、柔軟性が高く、表現力が豊かなモデルです。その一方で、訓練データに過剰に適合してしまう過学習（overfitting）が起こりやすいという問題があります。過学習を防止するために、以下のような手法が用いられます。</p>



<ul class="wp-block-list">
<li>正則化（Regularization）：パラメータの大きさにペナルティを課すことで、モデルの複雑さを制御します。L1正則化とL2正則化が代表的です。</li>



<li>ドロップアウト（Dropout）：学習時に、ランダムにニューロンを無効化することで、モデルの過剰な適合を防ぎます。</li>



<li>アーリーストッピング（Early Stopping）：検証データに対する誤差が増加に転じた時点で学習を打ち切ることで、過学習を防ぎます。</li>
</ul>



<h2 class="wp-block-heading">ニューラルネットワークの発展の歴史をより詳しく</h2>



<p class="wp-block-paragraph">ニューラルネットワークの歴史は、1940年代にさかのぼります。以下では、ニューラルネットワークの発展の主要なマイルストーンを詳しく見ていきます。</p>



<h3 class="wp-block-heading">1943年：McCulloch-Pittsニューロン</h3>



<p class="wp-block-paragraph">Warren McCullochとWalter Pittsは、1943年に「A Logical Calculus of the Ideas Immanent in Nervous Activity」という論文を発表し、ニューロンの数理モデルを提案しました。このモデルは、McCulloch-Pittsニューロンと呼ばれ、ニューラルネットワークの基礎となりました。</p>



<h3 class="wp-block-heading">1958年：パーセプトロン</h3>



<p class="wp-block-paragraph">Frank Rosenblattは、1958年に「The Perceptron: A Probabilistic Model for Information Storage and Organization in the Brain」という論文を発表し、パーセプトロンを開発しました。パーセプトロンは、単層のニューラルネットワークであり、線形分離可能な問題を学習することができました。</p>



<h3 class="wp-block-heading">1969年：パーセプトロンの限界</h3>



<p class="wp-block-paragraph">Marvin MinskyとSeymour Papertは、1969年に「Perceptrons」という本を出版し、パーセプトロンの限界を指摘しました。彼らは、パーセプトロンがXOR問題のような非線形分離問題を解けないことを示しました。この指摘により、ニューラルネットワークの研究は一時的に停滞しました。</p>



<h3 class="wp-block-heading">1986年：誤差逆伝播法</h3>



<p class="wp-block-paragraph">David RumelhartとGeoffrey Hintonらは、1986年に「Learning representations by back-propagating errors」という論文を発表し、誤差逆伝播法（バックプロパゲーション）を提案しました。誤差逆伝播法は、多層ニューラルネットワークの学習を可能にし、ニューラルネットワークの研究が再び活性化するきっかけとなりました。</p>



<h3 class="wp-block-heading">1989年：畳み込みニューラルネットワーク（CNN）</h3>



<p class="wp-block-paragraph">Yann LeCunらは、1989年に「Backpropagation Applied to Handwritten Zip Code Recognition」という論文を発表し、畳み込みニューラルネットワーク（CNN）を提案しました。CNNは、画像認識のタスクで高い性能を示し、現在に至るまで広く用いられています。</p>



<h3 class="wp-block-heading">1997年：長短期記憶（LSTM）</h3>



<p class="wp-block-paragraph">Sepp HochreiterとJürgen Schmidhuberは、1997年に「Long Short-Term Memory」という論文を発表し、長短期記憶（LSTM）を提案しました。LSTMは、リカレントニューラルネットワーク（RNN）の一種であり、長期的な依存関係を学習することができます。LSTMは、自然言語処理や時系列データ解析で広く用いられています。</p>



<h3 class="wp-block-heading">2006年：深層信念ネットワーク（DBN）</h3>



<p class="wp-block-paragraph">Geoffrey Hintonらは、2006年に「A fast learning algorithm for deep belief nets」という論文を発表し、深層信念ネットワーク（DBN）を提案しました。DBNは、複数の制限付きボルツマンマシン（RBM）を積層したモデルであり、事前学習とファインチューニングによって学習します。DBNは、深層学習の発展に大きく貢献しました。</p>



<h3 class="wp-block-heading">2012年：ImageNetの画像認識コンペティション</h3>



<p class="wp-block-paragraph">2012年に開催されたImageNetの画像認識コンペティションで、Geoffrey Hintonらが提案した深層畳み込みニューラルネットワーク（CNN）が高い精度を達成しました。このできごとを契機に、深層学習が脚光を浴び、ニューラルネットワークの研究が再び活性化しました。</p>



<h3 class="wp-block-heading">2017年：Transformer</h3>



<p class="wp-block-paragraph">Ashish Vaswaniらは、2017年に「Attention Is All You Need」という論文を発表し、Transformerを提案しました。Transformerは、自然言語処理のタスクで高い性能を示し、現在に至るまで広く用いられています。</p>



<p class="wp-block-paragraph">以上が、ニューラルネットワークの発展の主要なマイルストーンです。ニューラルネットワークの研究は、長い歴史を持ちながらも、現在も活発に行われており、今後のさらなる発展が期待されています。</p>



<h2 class="wp-block-heading">ニューラルネットワークの数式表現</h2>



<p class="wp-block-paragraph">ニューラルネットワークを数式で表現すると、以下のようになります。</p>



<p class="wp-block-paragraph">入力層のニューロンの出力を \(x_i\)、隠れ層のニューロンの出力を \(h_j\)、出力層のニューロンの出力を \(y_k\) とします。また、入力層から隠れ層への重みを \(w_{ij}\)、隠れ層から出力層への重みを \(w_{jk}\) とします。</p>



<p class="wp-block-paragraph">隠れ層のニューロンの出力は、以下の式で計算されます。</p>



<p class="wp-block-paragraph">$$h_j = f(\sum_i w_{ij} x_i + b_j)$$</p>



<p class="wp-block-paragraph">ここで、\(f\) は活性化関数、\(b_j\) はバイアス項です。</p>



<p class="wp-block-paragraph">出力層のニューロンの出力は、以下の式で計算されます。</p>



<p class="wp-block-paragraph">$$y_k = f(\sum_j w_{jk} h_j + b_k)$$</p>



<p class="wp-block-paragraph">ニューラルネットワークの学習では、教師データを用いて、重みとバイアスを調整します。代表的な学習アルゴリズムとして、誤差逆伝播法があります。</p>



<h2 class="wp-block-heading">Pythonでのニューラルネットワークの実装例</h2>



<p class="wp-block-paragraph">Pythonを使って、簡単なニューラルネットワークを実装してみましょう。基本的には、ライブラリを利用して実装を行います。</p>



<h3 class="wp-block-heading">Pytorchの場合</h3>



<pre class="wp-block-code python"><code><code>import torch
import torch.nn as nn
import torch.optim as optim

<em># ニューラルネットワークの定義</em>
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

<em># モデルの初期化</em>
model = Net()

<em># 損失関数とオプティマイザの定義</em>
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

<em># 訓練ループ</em>
for epoch in range(10):
    for inputs, labels in train_loader:
        inputs = inputs.view(-1, 784)
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()</code></code></pre>



<h3 class="wp-block-heading">Tensorflowの場合</h3>



<pre class="wp-block-code python"><code><code>import tensorflow as tf

<em># ニューラルネットワークの定義</em>
model = tf.keras.Sequential(&#91;
    tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
    tf.keras.layers.Dense(10)
])

<em># モデルのコンパイル</em>
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=&#91;'accuracy'])

<em># モデルの訓練</em>
model.fit(x_train, y_train, epochs=10, batch_size=32)</code></code></pre>



<h3 class="wp-block-heading">Kerasの場合</h3>



<pre class="wp-block-code python"><code><code>from tensorflow import keras

<em># ニューラルネットワークの定義</em>
model = keras.Sequential(&#91;
    keras.layers.Dense(128, activation='relu', input_shape=(784,)),
    keras.layers.Dense(10, activation='softmax')
])

<em># モデルのコンパイル</em>
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=&#91;'accuracy'])

<em># モデルの訓練</em>
model.fit(x_train, y_train, epochs=10, batch_size=32)</code></code></pre>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">ニューラルネットワークは、人工知能の基礎となる技術であり、近年の深層学習の発展に大きく貢献しています。本記事では、ニューラルネットワークの基本概念、歴史、数式表現、Pythonでの実装例について解説しました。ニューラルネットワークを理解することは、AIの原理を学ぶ上で重要な一歩となるでしょう。今後も、ニューラルネットワークの研究が進展し、より高度なAIが実現されることが期待されます。今大いに流行っている生成AIもこの技術の進化の賜物ですね。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.ct-innovation.blog/dl-freetime/programming/python/2790/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
