総合的な学習の時間

これまでに学んできた国語,英語,数学,理科,社会の知識を生かして何か書きます.

〇〇ラーニング

お久しぶりです.
大学院生活が始まって1ヶ月ちょいですが
充実した研究生活を送っております.


さてと,早速ですが
タイトルの〇〇には何が当てはまるでしょうか?

...
...

教育に関心がある人は 「アクティブラーニング」

人工知能に関心がある人は 「ディープラーニング」

英語の勉強しなきゃという人は 「スピードラーニング

このあたりを思い浮かべるんじゃないかと思います.
どれも新聞でよく目にしますね.
まあスピードラーニングに関しては「広告で」という意味ですが(笑)

さて,今日はそのスピードラーニング


を除いた2つのラーニングについて
徒然なるままに書き連ねていこうかと思います.


それぞれの概要を簡単にさらってみましょう.*1


アクティブラーニング

これは教育用語なので,とりあえず文科省の定義*2から見ておくと

教員による一方向的な講義形式の教育とは異なり、学修者の能動的な学修への参加を取り入れ た教授・学習法の総称。学修者が能動的に学修することによって、認知的、倫理的、社会的能力、 教養、知識、経験を含めた汎用的能力の育成を図る。発見学習、問題解決学習、体験学習、調査 学習等が含まれるが、教室内でのグループ・ディスカッション、ディベート、グループ・ワーク 等も有効なアクティブ・ラーニングの方法である。

とのことです.
つまり

先生が「教える」のではなく
自分で,あるいは自分たちで「学ぶ」こと

に重点をおいた教育方法ってことですね. 教えない教育方法っていうと
言葉の使い方に違和感があるような気もしますが
ここは目をつぶっておきましょう.


ディープラーニング

f:id:takaya-wisdom0616:20160522204405p:plain:w250    f:id:takaya-wisdom0616:20160522204416p:plain:w250

とてもとてもとても簡単な説明になりますが

左図のようなユニットを右図のようにたくさんつなぎ合わせると
いろいろなパターン認識の問題を学習して解けるようになるよ!

っていう機械学習人工知能)の仕組みの総称が,ディープラーニングです.

左図にはいろいろな矢印と記号がついてますが

ユニット(図ではただの◯)が受け取るいくつかの入力Xに
それぞれ重みWを掛けあわせて
全部足して
fという関数を通して
yを出力する.

という操作をしているだけです.
つまり1つ1つのユニットはとても単純なことしかできないのだ.と理解いただければ大丈夫です.


あんまり関係なさそうなことを2つも取り上げて何がしたいのかというとですね

この2つのラーニングって
どちらも創発の可能性を持ってるという点で共通してるんじゃないかと主張したいんです.

創発っていうのは複雑系科学の用語なんですが
簡単に言うと

単純なモノが複数集まって相互作用しあうと,すべてのモノを足し合わせたモノ以上の何かが出来上がる.

ってことです.

ディープラーニングの方は
上で確認したような簡単な仕組みの繋がりが
犬と猫を見分けたり囲碁のプロに勝ったりしてるわけですから
創発していると言っていいと思います.

一方,アクティブラーニングの方は
一人で勉強したり受け身で勉強したり
といった場合には実現しなかったであろう学習成果
が得られる事例もあるそうです.(失敗事例もよく聞きますけどね…)
グループワークやディスカッションなどによって
先生も想像していなかったような子どもの「気づき」や「学び」
が得られるのだとしたら
それも立派な創発ではないでしょうか.


いずれのラーニングについても,俗な言い方をすれば
「最近めっちゃ流行ってる」
ので
そろそろお互いを意識しあった議論が生まれてくるかもしれませんね.

研究テーマにはならないかもしれないけど...(笑)


おわり.

*1:そんな説明じゃダメだろ!という専門家の方がいらっしゃったらゴメンナサイ.
大枠が伝わればいいかなというスタンスでやってます.

*2:http://www.mext.go.jp/component/b_menu/shingi/toushin/__icsFiles/afieldfile/2012/10/04/1325048_3.pdf

カオス

ここに2つのグラフがあります。

f:id:takaya-wisdom0616:20160216163040p:plain:w300f:id:takaya-wisdom0616:20160216162923p:plain:w300

これらは何のグラフでしょうか?


気温の変化でしょうか?

震度計の記録でしょうか?

はたまた株価チャートでしょうか?

そして、2つのグラフにはどんな違いがあるでしょうか?


まずは左(スマホだと上)のグラフから説明しましょう。

これは、0から1の間のランダムな値を100個プロットしたものです。

Pythonですが、以下のコードで似たようなグラフが描けます。

import numpy as np
from numpy.random import *
from pandas import *
import matplotlib.pyplot as plt

ts = Series(rand(100))

ts.plot()
plt.show()

要は、テキトーーに描いたグラフってことです。


続いて、右(スマホだと下)のグラフ。

これは

{ \displaystyle
x_{n+1} = ax_n(1-x_n)
}

という漸化式によって求められる { \displaystyle
x_n
}

{ \displaystyle
x_{100}
} まで求めてプロットしたものです。

ただし

{ \displaystyle
x_0 = 0.5, a = 3.95
}

としています。

コードは以下のとおりです。

import matplotlib.pyplot as plt
from pandas import *

xlist = []
a = 3.95
x_0 = 0.49
xlist.append(x_0)

for i in range(100):
    x_n = a * xlist[i]*(1-xlist[i])
    xlist.append(x_n)

ts = Series(xlist)
ts.plot()
plt.show()

これまたテキトーに描きました

と言われても納得してしまうようなグラフですが

実際は1つの式から生み出されているなんて不思議ですね。


一見ランダムなようで、実は法則に従っている。


こういう現象をカオスといいます*1


カオスと言っても

「掃除しなさすぎて部屋がカオスwww」

とか

「TLがカオスすぎるwwwww」

とか

そういう意味のカオスではなく

学術的なカオスです。


3年くらい前からこのカオスに興味があって

卒論のテーマにしようかとも思いましたが

難しすぎて断念しました。


また気が向いたらカオスの話題を書いていこうと思います.


そういえば

はじめて「カオス」という言葉に出会ったのは

遊戯王の「カオスソルジャー」だったなぁ。


おわり。

*1:数学や物理学では、もっとしっかり定義されています

2次方程式を解いてみる Part2

前回の続きです。
2次方程式を解くためのプログラム

#include<stdio.h>
#include<math.h>

int main(void)
{
    int a,b,c;
    double x1,x2;
    a = 1;
    b = 5;
    c = 6;
    
    x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
    x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
    
    printf("%f\n%f\n",x1,x2);
}

を作りました。

これ、実数解のない2次方程式を解かせようとすると
どうなるんですかね・・・

試してみましょう。

{ \displaystyle
x^{2}+x+1=0
}

これならどうだ!

a = 1, b = 5, c = 6
だったところを
a = 1, b = 1, c = 1
にして・・・実行!!

nan
nan

ん?なんだこれは?

カレーによく合うやつかな・・・?

ちなみにナンを焼く窯のことを
タンドールといいます。

気になる人とカレーを食べに行った時のネタにでも使ってください。


話を戻します。


nanはwikipediaによれば色んな意味があるようですが
とりあえずは
「解けません」
とでも解釈しておきましょう。

そうはいってもやはり、いきなりnanが現れると
どうしてもカレーを連想してしまうので
プログラムに工夫を加えてみます。

もし結果がnanになったら
「解けません!」
と潔く叫んでもらいましょうか。

ここで使うのは条件分岐(if-else文)です。

if (isnan(x1))
        printf("解けません!\n");
    else
        printf("%f\n%f\n",x1,x2);

これは

もしx1とx2の値がnanになったら
「解けません!」
と表示しなさい。
そうでなければ2つの解を1行ごとに表示しなさい。

と命令しているのと同じです。

ifの後の()の中が真(True)だと、そのあとの命令が実行され
偽(False)だとelseの後の命令が実行されます。

isnan()というのは、()内の変数がnanだったらTrueを返してくれる関数で
今回の場合はこの関数によって、ifの後の()の中身がTrueになるわけです。

2次方程式だと
x1がnanなら自動的にx2もnanになるはずなので
x1だけ調べるようにしました。

ここまでをまとめると、以下の様なプログラムになります。

#include<stdio.h>
#include<math.h>

int main(void)
{
    int a,b,c;
    double x1,x2;
    a = 1;
    b = 1;
    c = 1;
    
    x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
    x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
    
    if (isnan(x1))
        printf("解けません!\n");
    else
        printf("%f\n%f\n",x1,x2);
}

実行してみましょう。

解けません!

大変潔くて好感が持てますね。
見習いたいものです。


今回はここまで! ごきげんよう!

2次方程式を解いてみる

今日は、2次方程式に挑戦してみようと思います。

{ \displaystyle
x^{2}+5x+6=0
}

を解いてみましょう。
まずは因数分解して

{ \displaystyle
(x+2)(x+3)=0
}

2つの解は

{ \displaystyle
x = -2, -3
}

となります。


おわり


ません。笑

中学生でも解ける2次方程式でしたが、今度はC言語で解いてみましょう。

しかし、方程式を入力したからといって勝手に解いてくれるわけではありません。

因数分解という操作も、実はコンピュータには難しい作業で
一からプログラムするのは難しいんです。

そこで、今回はこれをつかいます。

{ \displaystyle
x = \frac{-b\pm\sqrt{b^{2}-4ac}}{2a}
}

2次方程式 { \displaystyle
ax^{2}+bx+c=0
}の解の公式です。
(PCだと根号が上手く表示されてませんがお許し下さい。。。)

これを使えば、a,b,cの値さえ分かれば一発で計算ができるので
コンピュータにも楽勝です!

さっそくC言語で試してみましょう。

C言語で先ほどの解の公式を表現すると

x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
x2 = (-b-sqrt(b*b-4*a*c))/(2*a);

となります。
少しややこしいですが、sqrt()はカッコの中に入れた数値の平方根をとってくれる関数です。
ここでいう関数とは、データを入れると何らかの処理を施して返してくれる機能を持つもののことです。

この公式はまだ文字で表しているだけなので
a,b,cにはそれぞれどんな値が入るのかを、以下のように定義してあげる必要があります。

int a,b,c;
double x1,x2;
a = 1;
b = 5;
c = 6;

1行目は、「a,b,cの3つの変数には整数が入りますよ」という宣言です。
2行目は、「x1とx2という変数には実数が入りますよ」という宣言です。
3〜5行目では、a,b,cの値をそれぞれ具体的に定めています。

解が求められたら

printf("%f\n",x1);
printf("%f\n",x2);

で表示させることができます。

ここまでをまとめると

#include<stdio.h>
#include<math.h>

int main(void)
{
    int a,b,c;
    double x1,x2;
    a = 1;
    b = 5;
    c = 6;
    
    x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
    x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
    
    printf("%f\n%f\n",x1,x2);
}

となります。

あ、説明し忘れましたが、見覚えのない行がありますね。

 #include<math.h>

これ、sort()を使うために必要なおまじないです。


さあ、実行してみましょう・・・

-2.000000  
-3.000000

おぉ!なんか0が多いけど、ちゃんと計算してくれました!
さきほど因数分解から求めた解と一致してますね。

a,b,cの値をいろいろ変えて遊んでみると楽しいと思うので、試してみてください。


解の公式なんて初めて習ったときには
なんでこんなややこしい式覚えなきゃいけないんだ!
と憤慨したものですが
因数分解の苦手なコンピュータにとってはありがたい公式なんですね。


次回はこのプログラムに条件分岐を加えて遊んでみましょう。


ごきげんよう。

第2プログラミング言語

第2外国語ってありますよね。
もう2年前になりますが、私も第2外国語としてドイツ語を履修しました。
結局使う機会もなくて忘れてしまいましたがね。
唯一覚えてる表現といえば

Woren wir heute Abend ins Kino gehen?

くらいでしょうか。英語でいうところの

Shall we go to the cinema tonight?

まあ、「どのように言うか」よりも、「誰に言うか」が大事な表現ですね。


前置きはこれくらいにして、本題。
今回は第2外国語ならぬ第2プログラミング言語です。
普段は第1プログラミング言語としてPythonってのを使ってますが
新しくC言語に挑戦してみようと思います。
情報科とかだと最初に学ぶらしいですが、初心者にはちょっと難しいことでも有名です。

今日は、Hello world!*1 という文字列を表示するプログラムを作ってみましょう。

まずはメモ帳でもなんでもいいので、テキストエディタを開きます。
ちなみに私は「mi*2」というテキストエディタを使ってます。

テキストエディタを開いたら

#include<stdio.h>

int main(void)
{
    printf("Hello world!");
}

と打ち込みます。
とりあえず意味とかは考えずに、黙々と打ち込みます。
実際

printf("Hello world!");

の部分以外はおまじないのようなものらしいです。

printf()の中に、表示したい文字を""で囲めばいいわけですね。

最後に ; を付けるのを忘れずに。
普段は泣き顔(; ;)くらいにしか使わない記号ですが
C言語では句点として使われるようです。


入力ミスがないことを確認したら、ファイルに名前を付けて保存します。
hello.cという名前をつけて、デスクトップに保存しときましょう。

無事に保存できたら次のステップ
コンパイルを行います。
コンパイルっていうのは、今書いたC言語機械語に翻訳する作業です。
機械語機械語です。よく分かりません。

とりあえず、ターミナルを開いて
$ cd desktop
$ gcc -o hello hello.c
を実行すれば、コンパイルしてくれるようです。

デスクトップにhelloという新しいファイルができてます。

最後に
$ ./hello
を実行すると

Hello world!

と、ターミナルに表示されます。


感想:めんどくさい。

ただ一行表示するだけなのに手順がめんどくさすぎる。

Pythonだったら、ターミナルで
$ python を実行して

print "Hello world!"

と打ち込んでenterキーを押すだけで、同じ結果が得られます。


実は
C言語コンパイル型言語
Pythonインタプリタ言語
といって、ちょっと性質が違うんですね。

コンパイル型言語はプログラムをまとめて機械語に翻訳してから実行
インタプリタ型言語はいちいち翻訳しながら実行

っていう違いだそうです。

今回みたいに単純なプログラムなら、Pythonの方が手早く出来るのですが
複雑なプログラムだとまとめて翻訳して実行するほうが早いみたいです。

だからどちらの型も使えるようになっておいたほうがいいんですね。


まだHello world!しかできてませんが
今回はここまでにしておきましょう。

ではごきげんよう。

*1:プログラミングの入門ではまず初めにHello world!を表示させてみるという慣習があるのです。

*2:Macユーザーにオススメです。 http://www.mimikaki.net/download/ からダウンロードできます。

2016年

あけましておめでとうございます。

卒論に使うプログラムの検証作業を繰り返していたら
いつのまにやら年を越していました。
作業および執筆は今のところ順調です。


先ほど知ったのですが、PS3Wiiが発売されたのが2006年だそうで
今年でもう10年になるわけですね。なかなかショッキングな事実に戸惑いを隠せません。

そういえば、ゲーム機にインターネットを繋ぐのが当たり前になったのも、これらが発売されてからでしょうか。
最近は、IoT(Internet of Things)
といって
あらゆるモノがインターネットで繋がる時代が近づいてきています。
モノとモノでさえ繋がるのだから
ヒトとヒトがネットで繋がるのは、もはや当たり前ですね。
メールやSNS*1で新年のあいさつをするのも当たり前
ネットでお金を稼いだり、友達や恋人を作ったりするのも決して珍しいことではありません。

「繋がり」が多様になっているということは、人類が進歩している証拠です。
古代から現代にかけて、人類の「繋がり」は変化し、複雑さを増してきました。


ヒトとヒトが繋がってムラができ

ムラとムラが繋がってクニができ

クニとクニが繋がって国ができ

船や飛行機を介して国と国が繋がり

電話を介して遠くの個人と個人が繋がり…

インターネットはこれらの「繋がり」をさらに複雑にしました。


2016年は、さらにヒトとヒト、モノとモノとの繋がりが複雑化していくことでしょう。
その結果として、我々が全く予想していなかったような社会現象が現れることは避けられません。

それは戦争のようなものかもしれないし、交易のようなものかもしれません。

いつ何が起こるか分からない、不確実性にまみれた世の中ではありますが

人類にとって飛躍の年になることを祈ります。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

本日の記事は、「複雑ネットワーク」と「フラクタル性」を意識しました。

以上!!

*1:そういえばtwitterfacebookが登場したのも2006年でした。

人工知能への関心

卒論で忙しい今日このごろではありますが
年が明けてしまう前に、今年の個人的流行語大賞ともいえる

人工知能(Artificial Intelligence)」

との出会いについて書こうと思います。


2015年、人工知能に関する話題は後を絶たず
新聞やネットニュースで目にしない日は無いほどでした。
松尾豊氏の『人工知能は人間を超えるか』をはじめ、
人工知能に関する書籍も次から次へと出版されましたね。

昨年までの私には、人工知能に対する興味なんて微塵もありませんでした。
高校生の頃は世界史が大好きで、大学には社会科の教員になるために入学しました。
生粋の文系学生ですね。

読む本のジャンルも教育学や哲学が中心で
当時はAIよりも愛の方がよほど私の関心を惹きつけていました(笑)

人工知能の研究をするために大学院へ進学することになるなんて、一体誰が予想できたでしょうか。

図らずしも私と人工知能を結びつけたのは
社会科分野の一環として専門的に学んでいた経済学でした。
特に興味があったのは、株価や為替レートなどの金融時系列データ*1でした。
金融時系列の変動の複雑さに触れたことは
カオスやフラクタルといった「複雑系科学」の領域へと関心を広げるきっかけとなりました。

詳しいことはまた別の機会に書こうと思いますが
複雑系科学っていうのは人工知能と非常に密接に関わっている学術領域なんです。
そのため、ひとたび複雑系科学へと辿り着いてしまえば
人工知能へと歩をすすめるのは自然な流れであるともいえます。

AIに関心を持つに至った経緯はこんなところです。

とはいえ、いくらなんでもそれを研究するために大学院へ進学するというのは無謀だったかもしれません。
人工知能はあくまでプログラムですから
それを研究、または開発するためには
プログラミングスキルはもちろんのこと
線形代数や確率論、統計学といった数学の素養が求められます。

大学の専攻とは一切関係がないため、これらはすべて独学で習得しなければなりませんでした。

なんとか大学院には合格しましたが、まだまだ知識としては半年程度で詰め込んだ付け焼き刃です。

将来的には、これまで学んできた教育学や人文社会科学の素養もムダにしないような研究ができたらと思うので
引き続き精進していかなければ…

1つのアウトプットの場として、このようなブログを開設しましたので
もし興味を持っていただける方がいれば
今後もちょくちょく覗いてみてください。


卒論が落ち着いたら

  • 数学やプログラミングに関する話題
  • 複雑系科学に関する話題
  • 教育と哲学と人工知能を絡めた話題
  • 経済学に関する話題

などについて書いていけたらいいなと思っています。

どうぞよろしくお願いいたします。

あ、そうだ

松尾豊『人工知能は人間を超えるか』

ぜひ読んでみてください。

*1:厳密に言えば経済学というよりも金融工学の領域かもしれません