デジタル・デザイン・ラボラトリーな日々

アラフィフプログラマーが数学と物理と英語を基礎からやり直す。https://qiita.com/yaju

英語の -teen と -ty にまつわる話

はじめに

英語の teen と ty について、どっちか10台か迷うことってないですか? え、ないって、そうですよね。
確かに発音では迷うことはあっても、英単語として迷うことはないよね。

どちらか迷わなくなる方法として、単語を深く理解すると記憶に残りやすくなります。

teen と ty について

13(thirteen)以降の -teen は「加算(足し算)の10」を表し、13は「10足す3」という意味となります。 一方、twenty, thirty, forty などの -ty は「乗法(掛け算)の10」を表し、「2掛ける10」、「3掛ける10」などとなります。

これは日本語で表してみましょう。 13は「10足す3」という意味で、日本語で「じゅう・さん」となります。日本語では英語と違い加算の場合には「じゅう」を前に置く形になります。
20は 「2掛ける10」という意味で、日本語で「に・じゅう」となります。加算と違い乗法の場合には英語と同じく「じゅう」を後に置く形になります。 日本語では「じゅう」を置く位置で区別するのに対し、英語では置く位置は後ろで同じですが、-teen と -ty の語形で区別します。

11と12にはなぜ -teen がつかない?

英語を習った時に、11はeleven、12はtwelveとなり、13(thirteen)以降の -teen は付くようになることを覚えます。

eleven と twelve の語源は、もともとドイツ語(正確にはその昔使われていたゲルマン語)にあります。
einlif と tweilif で、どちらも後ろに lif が付いていることに気がつきます。この lif は leave の過去系の left が含まれています。

einlif :one left (over ten)…「10 に 1 あまる」⇒ eleven 11
tweilif:two left (over ten)…「10 に 2 あまる」⇒ twelve 12

これは諸説ありますが、12進数の名残りと考えられます。

12進法

10進法と並んで多くの文明で使われてきたのが、12進法の考えである。
現在も12進法は、時計の目盛りは12時間、1ダースは12個などに使われている。
何故かというと約数が多いからである。
10の約数は1,2,5,10の4種類
12の約数は1,2,3,4,6,12の6種類
数えることが主流な文化では10進法を用いたのに対して、分けることが主流な文化では12進法を用いました。天文学が発達した文明では方角を分ける際に、12という数が都合が良かったのです。

最後に

しばらくはてなブログの方には記事を書いていませんでした。GWは暇になるので機械学習に記事を作成していきたいと思います。

MacBook Proを買いました

はじめに

今年初めての記事になります。ここ数年は「サザエさんのじゃんけん データ分析」の結果報告を1月1日に書いていたりしましたが、結果報告をやめた訳ではないです。
ディープラーニングを使ってやりたいと思って出来ずに先延ばしで数年経ってしまったので、機械学習をきちんと理解した上で納得してから記事を書くつもりです。

今記事はタイトルにあるようにMacBook Proを購入しました。届いたのは2020/01/12(日)になります。
数ヶ月前からNEC「LaVie LL750/M」のCPUファンから異音がなるようになっていたので我慢ならなくなったんですよね。
ついに個人としてはWindowsメインから脱出したわけです。 まー仕事では相変わらずWindowsですからね。
Mac自体は2008/06/23にiMacを購入したのですが、ノートタイプではなかったのであまりメインで使うことはなく7年くらいしたらモニターが時間が経つとチラついて何も見えない状態になってしまい、2017/09/02に買取業者に700円で売却しました。しかし、今度はノートタイプですから肌にあっています。

購入内容

本体

16インチMacBook Pro - スペースグレイ ¥ 288,800
システム構成:
第9世代の2.3GHz 8コアIntel Core i9プロセッサ(Turbo Boost使用時最大4.8GHz)
16GB 2,666MHz DDR4メモリ
AMD Radeon Pro 5500M(4GB GDDR6メ‍モ‍リ搭載)
1TB SSDストレージ
True Toneを採用した16インチRetinaディスプレイ
Thunderbolt 3ポート x 4
Touch BarとTouch ID
バックライトキーボード - 日本語(JIS)
アクセサリキット

付属品

  • Magic Mouse 2 - スペースグレイ ¥ 9,800
  • USB-C - Lightningケーブル(1 m)¥ 1,800
  • USB-C - USBアダプタ ¥ 1,800

ソフトウェア

  • Microsoft Office Home and Student 2019(1ユーザー Mac 2台)¥ 23,800

別途購入

  • USB-C Digital AV Multiportアダプタ ¥ 6,800
  • Parallels Desktop 15 for Mac ¥ 6,480
    ベクターで購入
  • Windows 10 Home

最後に

消費税入れて35万円を超えるなど結構な額になりました。消費税 10%って30万超えたら3万円ですからね、痛いです。
ローンを組みたくなかったんですが、流石に24回払いにしました。5年以上は使える性能と考えれば仕方ないですね。

Macにおけるバックスラッシュ(\)の入力方法

TensorFlow 2.xによる sin波予測

はじめに

時系列データを使用した予測をやりたいと思って、良さげな教材が下記サイトになります。
qiita.com qiita.com

記事自体が、2016~2017年ということで少し古いですが、機械学習のリハビリもかねて動かしてみました。

環境

  • Google Colaboratory
  • TensorFlow 2.1.0-rc1

現時点(2019/12/30)ではGoogle Colaboratoryでは標準で「TensorFlow 2.x」になってないですが、もうすぐなると思います。
下記コードを入力することで「TensorFlow 2.x」に切り替えることができます。

%tensorflow_version 2.x
import tensorflow as tf
print(tf.__version__)

ソース

説明

4000件(50 x 80)のノイズ入りのサイン関数データを用意します。
左図は全体、右図は先頭160件(80 x 2)です。
f:id:Yaju3D:20191231204538p:plain

これを訓練データ、テストデータに分類し、100ステップ分の入力Xがあった際の出力yが101ステップ目になる様なデータセットを作ります。
この「100ステップ分の入力Xがあった際の出力yが101ステップ目になる」をしている意味がよく分からなくて悩んでいたところ、下記サイトに「普通の regression と異なるのは、履歴 sequence から next value を予測することです。」と書かれていて、なるほどと思いました。
tensorflow.classcat.com

つまり、1~100の履歴値の予測値は101番目の値、2~101の履歴値の予測値は102番目の値、3~102の履歴値の予測値は103番目の値というようにするわけです。

訓練データは、全体の9割 4000 \times (1 - 0.1) = 3600 件で、テストデータは残りの 400 件となります。

in_out_neurons = 1
hidden_neurons = 300

model = Sequential()  
model.add(tf.keras.layers.LSTM(hidden_neurons, batch_input_shape=(None, length_of_sequences, in_out_neurons), return_sequences=False))  
model.add(Dense(in_out_neurons))  
model.add(Activation("linear"))

ニューラルネットの構造は model にさまざまなレイヤを add() することで構築できます。
300個の LSTM 中間層に投げ、それを1個の出力層に集約し、linear 活性化関数を掛け合わせています。

model.compile(loss="mean_squared_error", optimizer="rmsprop")

modelのコンパイル時に、誤差関数(平均二乗誤差)、最適化アルゴリズム(RMSprop)を指定しています。

学習データを用いた予測は、predict() を用いて行います。

predicted = model.predict(X_test) 

dataf =  pd.DataFrame(predicted[:200])
dataf.columns = ["predict"]
dataf["input"] = y_test[:200]
dataf.plot(figsize=(15, 5))

予測値と入力値の 200 件分を同時に表示します。

最後に

ちゃんと中身を理解していかないとですね。

英語の勉強の習慣化

はじめに

毎年数ヶ月もすれば何もしないで終わっていた英語の勉強ですが、11ヶ月経った今でも続けることが出来ています。
平日の会社終わりにコワーキングの「エニシア静岡 丸井店」に行って、そこで英語の勉強をしています。

ただ時間が30分~40分くらいと確かに短いかなと思いますが、仕事終わりということで長いと集中力が続かないですね。たまに寝てしまうし・・・

何をしているか

瞬間英作文のiPhoneアプリ版を使用して、ひたすら繰り返しています。
そして疑問に思ったことは調べて下記にまとめています。 yaju3d.hatenablog.jp

以前は、英文法の整序問題で正しい順序にして英文法を作成する「英語組み立てTOWN」もやっていたのですが、今はやめてしまっています。
これは瞬間英作文を結構やっているのに進歩がないような気がしていて、瞬間英作文のみに絞っています。

家でやる習慣を付ける

家だと何もしたくない。でも、それだと平日の30分しかしていないわけで、土日も何もしていないわけです。
当然、進捗が遅いわけですよ。TOEIC受験なんて今のレベルでは全然駄目だと思って今年も受けなかったです。

今後は家でやる習慣を付けるようにしたいですね。

Audio版「Doraemon」は半年前くらいに準備だけして、その後に何もしていなかったので家ではこれをひたすら聞いていこうと思います。
「Doraemon」は勉強って感じではなく、気分転換で読むイメージですからね。

最後に

ひらすら続けるのみ。

ステップ関数を理解してみる

はじめに

活性化関数としてステップ関数がある、ニューラルネットワークの起源となるアルゴリズムのパーセプトロンでAND回路やOR回路の構成に使用されたものです。

yaju3d.hatenablog.jp

過去にシグモイド関数をやってきてるのに、なんで初期の活性化関数であるステップ関数に戻るのかというと、それは微分不可能だから。
活性化関数 Relu も微分不可能なのにディープラーニングの隠れ層では推奨されています。

私の方で活性化関数で「微分不可能」というところに理解が引っかかっているので、原点に戻って整理しようと考えたのです。

あとで追記します。

参考

ステップ関数

形式ニューロン

f:id:Yaju3D:20170528144340p:plain f:id:Yaju3D:20170528154127p:plain
左図が本物の神経細胞(ニューロン) で、右図が形式ニューロンです。
形式ニューロンをWikipediaから引用します。

形式ニューロン(けいしきニューロン、英: formal neuron)や Threshold Logic Unit とは、1943年に神経生理学者・外科医であるウォーレン・マカロックと論理学者・数学者であるウォルター・ピッツが発表した最初の人工ニューロン(英: artificial neuron)[1]。伝達関数としてはヘヴィサイドの階段関数を使い、入出力の値は 0 または 1 の二値だけをとる。

簡単に説明すると、入力が2つあり各入力に対して重みが掛け算され、その値が閾値を超えれば出力は「1」、そうでなければ出力は「0」となります。 たとえば、入力が(1,0)、重みが(0.5, 0.7)だとすると、1×0.5 + 0×0.7 = 0.5 を計算して閾値と比較します。

形式ニューロンの場合、入力が「0」か「1」、重みが「実数」、出力が「0」か「1」となります。

単位ステップ関数

後述するヘヴィサイド関数との違いは、x = 0 の時も1の値を持つものとして定義していること。

f(x) = \begin{cases} 1 & (x \geq 0) \\ 0 & (x < 0) \end{cases}

機械学習のサンプルプログラムで使用されるステップ関数は、x = 0 の時は0の値になっているので用途によって定義が違うんでしょうね。

def step(x): 
    return 1 if x > 0 else 0
f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x \leq 0) \end{cases}

f:id:Yaju3D:20170603024904p:plain

ヘヴィサイド関数

ヘヴィサイドの階段関数 は、正負の引数に対しそれぞれ 1, 0 を返す階段関数となります。

f(x) = \begin{cases} 1 & (x > 0) \\ 0 & (x < 0) \end{cases}

又は、原点を埋めて

f(x) = \begin{cases} 1 & (x > 0) \\ \frac{1}{2} & (x = 0)  \\ 0 & (x < 0) \end{cases}

パーセプトロン

単純パーセプトロン

単純パーセプトロンの活性化関数としてステップ関数を使用しています。
qiita.com

rightcode.co.jp

多層パーセプトロン

多層パーセプトロンの活性化関数としてステップ関数を使用しています。
rightcode.co.jp

ステップ関数の限界

多層パーセプトロンの精度をよくするための誤差逆伝播(バックプロパゲーション)が生み出されたのですが、ステップ関数は微分が出来ないため、ラメルハートらは誤差を伝播できるような微分可能な活性化関数として、シグモイド関数を用いるようになりました。
rightcode.co.jp

最後に

今の自分は本やWebサイトを見て知識を得ているだけで、本当の意味で理解出来ていないことがあらためて分かったので、ちゃんと理解するようにプログラムを組んでみることにします。

静岡の勉強会の構想を考える

はじめに

2016/4/23に静岡Developers勉強会で「人工知能ハンズオン」を開催しました。 yaju3d.hatenablog.jp

当時はTensorFlowが出始めて人工知能がバズワードでした。TensorFlowに関する本も少ない上に自分自分が機械学習に関する知識が全然なかったです。
ともかくネットで検索しまくって、分かりやすいと評判があった上野山徹さんが作成した八百屋の問題のスライドや定番のMNISTの文字認識をやりました。

いつかリベンジしないと思いつつ時が経ってしまいましたが、3年半の間に何もしていなかったわけではありません。ペースは遅いながらも着実に基礎的な部分の勉強はしてきました。

11月か12月を目処に「人工知能ハンズオン リベンジ」として勉強会を開催しようと思っています。

構想

9月中にTensorFlow 2.0がロードマップを見るとリリース予定になっています。だた、今回はTensorFlowを使うかは考え中です。

例えば画面に円を描きたいといった場合、APIを使えば難なく円を描けるでしょう。しかし、APIを使わないで円を描こうとしたらどうでしょう?
三角関数の知識が必要となりますね。一方でAPIを使えば円も描けて目的の表現が出来るなら別に数学の知識はいらないとも言えます。
以前、人工知能できゅうりの仕分けをしたとして話題がありましたが、TensorFlowの文字認識MNISTのサンプルを改良したら出来てしまったわけで、数学の知識を必要となったわけではありませんが、きゅうりの仕分けをする目的は達成できたのです。誰もが簡単に人工知能を使用して目的を果たせた良い事例となったのです。 数学の知識があっても人工知能ではどうしようもない場合があります。将棋の最強AIであるPonanzaを開発した山本一成さんは東京大学出身です。山本一成さんのドキュメンタリーを観たことがありますが、行き着くところまでいったPonanzaではパラメーターをいじることでしかより強くすることが出来ません。そして、そのパラメーターをどういじっていいのかは、もはや開発者本人にも分からない状態なのです。

パラメーターをいじって試すのにコストがあまりかからない場合はいいでしょうが、物によっては1回試して動かすのに数百万かかるとしたらどうでしょう? 人工知能がこういってますからと言ってもクライアントに納得行く説明ができないと駄目だったりします。例えば半導体とか試すだけでも何千万かかかります。

ちょっと話が行き過ぎました。そこまでいかなくても、最低限の数学の知識があった上で人工知能を使えるようになりたいわけです。

目標

「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」という名著があります。

この本に挫折した人が、勉強会を受けた後で読み直したら少しは理解が出来るようになったと言えるようにしたいのが今回の勉強会の目標としたいわけです。

予定

これから考えていきます。
1次方程式から傾きや切片、微分や確率など数学の基礎的なところからとなりますね。だから昨今の人工知能の派手さなんてものはありません。

Google Colaboratory と Google スプレッドシートを使用する予定なので、GoogleアカウントがあればPCにインストールは不要です。
タブレット端末とキーボードがあればいいような感じにしたいです。

ちなみに料金は無料です。会費は1万円くらい余っているので会場費がまかなえる。

最後に

この記事は少しずつ書き換えていきます。

スポンサーリンク