まるっとワーク

データ分析・電子工作など気になることを残していきます

人工ニューロンについて


ディープラーニングについて学習を始めたので、関連するアルゴリズムであるパーセプトロンについて説明していきたいと思います。

目次


ニューロンと人工ニューロンとは

パーセプトロンの前に、本アルゴリズムのモデルとなったニューロンについてまとめます。
ニューロンは神経系を構成する基本単位であり、体の中で情報の伝達に使われいる。
人工ニューロン(形式ニューロン)とは、それを模擬したものであり、1943年にウォーレン・マカロックとウォルター・ピッツが発表した。

人工ニューロンの仕組み

人工ニューロンは、パーセプトロンとも呼ばれる。
構造はとてもシンプルで、複数の入力に対して0 か1を出力するだけのもの

人工ニューロンの構造

人工ニューロン1つ の構造は以下の通り。

図:入力が2つの人工ニューロン(単純パーセプトロン)の構造
f:id:toku_dango:20211204160553p:plain

  • 入力(x): パーセプトロンに入力される値
  • 重み(w): 入力値に乗算される値
  • バイアス(b): 出力値を調整する値
  • 出力(y): 出力値(パーセプトロンでは0か1で出力される)

図の〇はニューロン, ノードと呼ばれる。

人工ニューロンの動作

実際に人工ニューロンでどういう計算がなされているかを説明します。
上の図で示した人工ニューロンの動作を式で表すと以下の通りです。


・人工ニューロン

y = x1×w1+x2×w2 + b×1\\
=\sum_{}X^TW
人工ニューロン1個の式を見ると、線形モデルと同じ式であることがわかるかと思います。
かなりシンプルな構造ですね。

上記計算だと、出力値が0, 1に固定されていない状態なので、しきい値:Thを設けて以下条件指定が入ったものが人工ニューロンの動作になります。
 
y
= \left\{ \begin{array}{}
0 & (y<=Th)\\
1 & (y>Th)
\end{array} \right.

単純な論理回路の設計

人工ニューロンの活用例として、簡単な論理回路を作成してみます。

簡単な実装

表:ANDゲートの真理値表

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1


これをpythonにて実装する。

def AND(x1, x2, b):
    w1, w2, theta = 0.5, 0.5, 1
    temp = x1*w1+x2*w2+b*1
    if temp <= theta:
        return 0
    elif temp > theta:
        return 1
    
AND(0,0,0)#出力0
AND(1,0,0)#出力0
AND(0,1,0)#出力0
AND(1,1,0)#出力1

期待通りの出力が得られています。
同様にORゲート, NANDゲートは作成できるので、ここでは割愛します。

作成できる論理回路の限界

上記の通り、論理回路を実装することができたのですが、排他的論理和XORだけは実装ができません。
実際にグラフを作成してその理由を確認します。

表:XORゲートの真理値表

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0


これを図で示すと以下の通りです。

図:人工ニューロンの可視化
f:id:toku_dango:20211204171333p:plain

  • 赤丸:1が出力する
  • 青四角:0が出力する

しきい値の例を黒線で示し、黒線からx1, x2軸側の範囲が0出力領域、それ以外を1出力領域とする

これを上記通り出力しようとしても、しきい値は線形的にしか引くことができない為不可能。
これに対応するためには、非線形な線でしきい値を設定する、複数の直線で切り分ける方法があります。

ただ、論理回路の作り方に詳しい人はご存じの通り、XORゲートも複数の論理回路の組み合わせで表現が可能です。
これは上記で述べた後者の方法になります。前者の方法は今後説明していくとして、人工ニューロンを組み合わせる(多層にする)考え方でXORゲートを実装することができます。
つまり、人工ニューロンの組み合わせでXORゲートような少し複雑なパターンも表現できるということです。
※層を複数に重ねた人工ニューロンを多層パーセプトロンということがあります。

グラフ出力用のコード

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x1_0 = [0, 1]
x2_0 = [0, 1]
x1_1 = [0, 1]
x2_1 = [1, 0]
plt.scatter(x1_0, x2_0, marker=",")
plt.scatter(x1_1, x2_1, marker="o", color="red")
plt.plot([-1, 1.5], [1.5,-1], color="black")

plt.xlim(-1,3)
plt.ylim(-1,3)
plt.xlabel("x1")
plt.ylabel("x2")


まとめ

今回は人工ニューロンについて、まとめました。
人工ニューロンはシンプルなアルゴリズムでしたが、組み合わせによって非線形的な表現も可能であり、ディープラーニングの根幹となる技術となります。

  • 人工ニューロンは、入力・出力・重み・バイアスにて表現され、入力と重みを乗算してバイアスを加算したものと、設定したしきい値との関係により、出力が決定される線形的なアルゴリズム
  • 人工ニューロンを多層にすることで、より複雑な表現が可能となる

ディープラーニングについて(言葉の定義など、はじめの一歩)


ディープラーニングについて学習を始めたので、理解した内容についてまとめて説明していきたいと思います。

目次

Deep Learningとは?

【解析手法という観点では】
人間が行う一連のタスクをコンピュータに学習させる機械学習の手法のひとつ。

f:id:toku_dango:20211202003141p:plain

【モデル構造という観点では】
3層以上の層を深くしたニューラルネットワーク構造

f:id:toku_dango:20211202232403p:plain

MITが発刊している『Deep Learning Book』には以下の通り述べている。

Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as a nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones.


"階層構造のモデルの持ち、機械が自動的にデータから特徴を抽出してくれるディープニューラルネットワーク(DNN)を用いた学習のこと"を指しています。

なぜDeep Learningが使われるのか

「データを学習して特徴を捉えることによって、複雑な表現が可能であり、
何かの予想をする際に上手くいくケースが多い為」
物理現象に基づいたモデルを構築してくれるわけではないので、なぜかわからないけど上手くいくというケースも多い。

ただし、非常に多くのデータとコンピュータリソース、そして時間がかかるという課題もある。

層を深くする意味とは

"層を深くすること"で複雑なモデル表現が可能になったDeep Learning、層を深くするところの意味は大きく分けて2つあります。
・ネットワークのパラメータ数を少なくできる
5×5の畳み込み演算実施の際のパラメータ数と3×3の畳み込み演算を2回実施するときのパラメータ数を比較すると、25(5×5) > 18(2×3×3) であり、2回実施した方がパラメータ数を少なくできる。

・学習の効率が上がる
画像認識において、畳み込み層の数だけ、特徴を抽出できる構造となっており、層を深くした方が特徴抽出が速く進む。

Deep Learningの種類

Deep Learningは、多様な目的において活躍しており、多様な種類が存在する。
それぞれは、その目的に合わせて活用される。

Deep Learnigの基礎技術

畳み込み層とプーリング層と呼ばれる層を有しているDNN。画像認識にて多く活用される。
近年は、それを発展させたResNetと呼ばれる技術も登場

時系列データに対応するため、各層の入力として 前時刻の出力を入れる構造を持つ。時系列データの解析で多く使われる。
近年は、それを発展させたLSTMと呼ばれる技術も存在

  • GAN(敵対的生成ネットワーク)

生成ネットワークと識別ネットワークと呼ばれる、2つのネットワークを組み合わせて学習を進める。
主に画像の生成などで使用される。


まとめ

今回は導入ということでDeep Learningの概要をまとめました。具体的なモデルについても勉強してまとめていきたいと思います。

Python: lambda式を使う

Pythonプログラムにおいて、複数回同じ作業を実施したいときは関数を定義して実行しますが、関数に名前を付けずに簡潔に宣言するlambda式を使った書き方をまとめます。

基本の書き方

lambda 引数: 処理内容
のように書く。

通常の関数を用いた書き方

import numpy as np
import pandas as pd

def calc(value, add):
    return value + add
 
print(calc(1,0.2))


lambda式を用いる場合

print((lambda value,add:value+add)(1,0.2))



listを対象としたlambda式での処理

lambda, mapメソッドを組み合わせる
mapメソッドの書き方: map(関数, リスト)

#データ
values = np.arange(100)

#lambda関数
print(list(map(lambda value:value+0.2, values)))


DataFrameを対象としたlambda式での処理

基本の使い方

lambda, applyメソッドを組み合わせる

#データ
df_values = pd.Series(np.arange(100))

#lambda関数
df_calc_value = df_values.apply(lambda x: x*2)
print(df_calc_value)

※2次元配列では、applyメソッドではなくapplymapメソッドを使用する

出力結果は以下の通り

0       0
1       2
2       4
3       6
4       8
     ... 
95    190
96    192
97    194
98    196
99    198
Length: 100, dtype: int64


if文処理含めたもの

同じくlambda, applyメソッドを組み合わせて使用する
lambda 引数 "Trueの処理" if 条件式 else "Falseの処理"

#データ
df_values = pd.Series(np.arange(100))

#lambda関数
df_calc_value = df_values.apply(lambda x: 100 if x > 10 else 0)
print(df_calc_value)


出力結果は以下の通り

0       0
1       0
2       0
3       0
4       0
     ... 
95    100
96    100
97    100
98    100
99    100
Length: 100, dtype: int64


まとめ

今回は無名関数と呼ばれるlambda式の書き方についてまとめました。
すべてを関数として書くと、コードが長くなってしまい、可読性が下がる場合があるので、意識して使いこなしていきたいですね

Python: mapやapply、applymapメソッドを使う

Pythonプログラムにおいて、DataFrameの各カラムに対してforループで処理をする際、非常に時間がかかる場合があります。
今回は、処理時間低減にも有効なmapメソッド/applyメソッドの使い方についてまとめます。

開発環境について

$wmic os get caption
>Microsoft Windows 10 Pro

$wmic os get osarchitecture
>64ビット

$python -V
Python 3.7.6


目次


mapメソッドとapplyメソッドの違い

対象となるデータ構造が違う

  • mapメソッド: Serieseに対応 (DataFrame意外だとlistにも対応)
  • applyメソッド: Seriese、DataFrame(各列/各行)に対応
  • applymapメソッド: DataFrameに対応

SerieseはDataFrameの1つのカラムを指すデータ構造であり、DataFrameはSerieseの集合体であるため、1次元データ構造, 2次元のデータ構造のどちらか一方もしくはその両方に対応したメソッドであるという違いがあるようです。

それぞれの使い方

mapメソッド

- list 対象の書き方
  map(関数, リスト)

  • Seriese対象の書き方

  Seriese.map(関数)

import pandas as pd
import numpy as np
# 対象データ作成

df = pd.DataFrame([[80,90], [50,40], [60,55], [70, 55], [90,95]], 
                  index=['Japanese', 'math', 'science', 'society', 'English'],
                  columns=['A','B'])

sample_list = [80, 50, 60, 70, 90]

# 関数定義
def evaluate_score(x):
    if x >= 60:
        y = "合格"
    else: 
        y = "不合格"
    return y

# list対象の書き方
A_score_list = map(evaluate_score, sample_list)

#Seriese対象の書き方
df['A_score'] = df['A'].map(evaluate_score)

#結果出力 list (map型のオブジェクト: イテレータ)
for i in A_score_list:
    print(i)

#結果出力 Seriese
print(df["A_score"])


出力結果は以下の通り

・list
合格
不合格
合格
合格
合格
・Seriese
Japanese     合格
math        不合格
science      合格
society      合格
English      合格

applyメソッド

- Seriese/DataFrame対象の書き方
  DataFrame.apply(関数, axis=@)

※@=0 or 1 DataFrameを渡したときに列/行毎に計算するのかを分ける

>|memo|
# 対象データ作成
df = pd.DataFrame([[80,90], [50,40], [60,55], [70, 55], [90,95]],
index=['Japanese', 'math', 'science', 'society', 'English'],
columns=['A','B'])

sample_list = [80, 50, 60, 70, 90]

# 関数定義
def evaluate_score(x):
if np.mean(x) >= 60:
y = "合格"
else:
y = "不合格"
return y

#DataFrame対象の書き方
print(df.apply(evaluate_score,axis=0))
#Series対象の書き方
print(df['A'].apply(evaluate_score))

|


出力結果は以下の通り。2次元配列を渡した方は、各列/各行データが関数の引数として渡されるため、戻り値も変わる。

・DataFrame
A    合格
B    合格
・Seriese
dtype: object
Japanese     合格
math        不合格
science      合格
society      合格
English      合格

applymapメソッド

- DataFrame対象の書き方
  DataFrame.apply(関数)

# 対象データ作成
df = pd.DataFrame([[80,90], [50,40], [60,55], [70, 55], [90,95]], 
                  index=['Japanese', 'math', 'science', 'society', 'English'],
                  columns=['A','B'])

sample_list = [80, 50, 60, 70, 90]

# 関数定義
def evaluate_score(x):
    if np.mean(x) >= 60:
        y = "合格"
    else: 
        y = "不合格"
    return y


#Seriese対象の書き方
print(df.applymap(evaluate_score))


出力結果は以下の通り

            A    B
Japanese   合格   合格
math      不合格  不合格
science    合格  不合格
society    合格  不合格
English    合格   合格

速度の違いについて

forループとapply等を使用した時の速度の違いを計算します。
上記サンプルデータはデータサイズが小さすぎるので、np.arangeで適当に1000万行分のデータを作成して時間を比較しました。
※処理時間計測にはTimeモジュールを使用

  • For Loop 処理時間: 4.781sec
  • Apply 処理時間: 2.62sec


検証用コード

import time
# 対象データ作成
sample = pd.Series(np.arange(10000000))

# 関数定義
def evaluate_score(x):
    if x >= 60:
        y = "合格"
    else: 
        y = "不合格"
    return y

start = time.time()
for i in sample:
    y = evaluate_score(i)
elapsed_time = time.time() - start
print ("ForLoop_elapsed_time:{0}".format(elapsed_time) + "[sec]")

start = time.time()
sample.apply(evaluate_score)
elapsed_time = time.time() - start
print ("apply_elapsed_time:{0}".format(elapsed_time) + "[sec]")


まとめ

今回はDataFrameの各カラムに対して一連の処理をするために使えるmapやapply, applymapメソッドについてまとめました。
データ数が膨大にあると、処理に時間がかかりますので、コードの組み方次第でだいぶ変わりますね。

機械学習について(言葉の定義など、はじめの一歩)


機械学習について学習を始めたので、理解した内容についてまとめて説明していきたいと思います。

目次

機械学習とは?

コンピューターサイエンティストで有名なRobert Elias Schapire氏は以下の通り述べている。

studies how to automatically learn automatically learn to make accurate
predictions predictions based on past observations

(Introduction to Machine Learning)


"過去の観察に基づいた正確な予想を自動的に行うこと"といった感じで、人が行う学習行為をPC上で表現するというニュアンスが入っている。
また、機械学習では主体はデータであり、データ内の関係を把握して、その法則(ルール)やアルゴリズムを学習するといったことに使われる。
物理法則や人間が考えたルールから答えを導くといった、ルール主体の考え方ではないことがポイント

機械学習の手法

色々なサイトでも書かれているが、以下の通り3つに分類される。
使うアルゴリズムが違うというよりは、解くべき問題(使用目的)が異なるという観点での分類

  解析目標のラベルが存在し、目標値とその他データとの相関関係の学習から、主に予想で使用される

  データ間の関係などの構造把握に使用される

  ゲームのスコアなどの目標値を最大化することを目的に、その仕組みを学習する為に使用される
※それぞれの代表モデル等は勉強を進めた後まとめていく

精度の高いモデル構築に向けて

より多くの種類・量のデータがあるほど、良い回答を導出できる。
ただし、ある程度目標値と関係あるデータが必要であり、目標値の説明に必要なデータ(変数)作成作業は特徴量エンジニアリングと言われるなど、機械学習において一番難しい。

AutoML(Automated Machine Learning)とは?

機械学習の機能を複数呼び出して使うことができるフレームワークであり、アルゴリズム固有値(ハイパーパラメータ)までも最適化対象となっている。
データの整形やエラー値の修正といった機械学習の前処理が自動化されたものや、ディスプレイツールを含んだものも存在する。
プログラムが得意でない方でも使うことができるという利点やデータサイエンティストの業務時間の削減に効果が期待できる。
対象データにどういったモデルが適しているのか、データ間の関係性の把握のためにAutoMLを使用するケースも多い。

代表的なAutoML

もっとも知名度が高いGoogleが開発したAutoML
文字列などのデータを自動的に整形する機能も有している。
cloud.google.com

Microsoftが開発したAutoML
docs.microsoft.com

IBMが開発したAutoML
www.ibm.com

まとめ

今回は導入ということで機械学習の概要やエンジニア向けの関連情報をまとめました。具体的なモデルについても勉強してまとめていきたいと思います。

matplotlibとseabornの日本語の文字化けを修正する

Pythonから利用できる可視化ライブラリ、matplotlibやseabornにて可視化を行った際の日本語の文字化けを防ぐ方法をまとめていきます。

目次

開発環境について

$wmic os get caption
>Microsoft Windows 10 Pro

$wmic os get osarchitecture
>64ビット

$python -V
Python 3.7.6

$pip list -V
scipy 1.4.1

問題事例

日本語が含まれるグラフを作成する場合、以下の通り文字化けが発生する。

import numpy as np
import matplotlib.pylab as plt

x = np.arange(100)
y = np.sin(x*0.1)
plt.plot(x, y)
plt.xlabel("時間")
plt.ylabel("値")


どうやら、本モジュールでは日本語に対応していない欧文フォント(sans-serif)をしているため日本語表示ができないようです。
f:id:toku_dango:20210924091239p:plain

対応方法

対応方法を調べてみると、Jupyterの設定ファイルを書き換えるなどの方法があるようですが、少し大変そうなので、これとは異なるより簡単な方法についてまとめます。

japanize-matplotlibモジュールをインストール

 このモジュールはmatplotlibのフォント設定を自動で日本語化してくれます。
pypi.org

$ pip install japanize-matplotlib

対応結果

ラベルの文字化けがなくなり、正常に日本語表示されるようになりました。

import numpy as np
import japanize_matplotlib #モジュール追加
import matplotlib.pylab as plt

x = np.arange(100)
y = np.sin(x*0.1)
plt.plot(x, y)
plt.xlabel("時間")
plt.ylabel("値")

f:id:toku_dango:20210924091257p:plain

まとめ

今回はデータ可視化の際の文字化けに対する対応方法をまとめました。
報告用で日本語表記のグラフを作成したい場合に、こういった対応をふと忘れてしまうので、忘れずに使えるようにしたいです。

Pythonが使えるように環境を整える

最近PCを買い替えたので、新しいPCにてPythonが使えるように対応した内容を残しておきます。


目次

開発環境について

Windows10 Home 64bit
Python 3.8.8

Pythonインストール

Pythonのみをインストールする、Anacondaなどの環境構築プラットフォームごとインストールするなど、いろいろと選択肢がありますが、まずはPython利用環境を構築する。

Pythonがインストールされたフォルダパスを確認

デフォルトでは"C:\Users\"以下にインストールされている

環境変数を編集

表示した環境変数テーブルの中の"Path"をダブルクリックして編集する。
f:id:toku_dango:20210912214704p:plain

Python.exeが存在するフォルダパスやScriptsパスにパスを通す。
以下の通りパスを追加
f:id:toku_dango:20210912214900p:plain

上記設定の後、コマンドプロンプトを再起動して"python"と入力してpythonが動作するかを確認
f:id:toku_dango:20210912215040p:plain

コマンドプロンプトpythonを実行するとMicrosoft Storeが開く問題

上記の通り、pythonインストール後にコマンドプロンプトで以下実行した際にMicrosoft Storeが開いてしまうことへの対応

$ python

対処方法

設定→アプリと機能→アプリ実行エイリアスを開く

  
f:id:toku_dango:20210912215541p:plain

アプリインストーラpython.exe (python3.exe)をオフにする

  
f:id:toku_dango:20210912215521p:plain

再度コマンドプロンプトを再起動して"python"と入力してpythonが動作するかを確認!
問題なく動作すれば解決です!

まとめ

最後に紹介したMicrosoft Storeが開いてしまうという問題で、私は詰まっていました。
原因がわからず、少し手間取ったので今後は時間を無駄にしないように上記まとめさせていただきました。