にゃーんAPI

お久しぶりです。
今回は思い付きでTwitterでにゃーんAPIを作ったので紹介します。
決してAIが難しくて逃げているわけではありません。

さて、まずTwitter Application Managementでアクセスキーを4つ取得します。ここらへんはほかのブログでも解説されているでしょう。

次に、適当なとこからPHP実行環境を作ります。なんかPHPでやっている人が多そうだったのでそれに倣いました。
今回はWAMP, MAMP and LAMP Stack : Softaculous AMPPSを使いました。
んで、インストールしたらフォルダ見て、AMPPS/www直下にNyaanAPIってフォルダ作って、そこにGitHub - abraham/twitteroauth: The most popular PHP library for use with the Twitter OAuth REST API.からダウンロードしたのをtwitteroauthにリネームして入れて、
PHPからTwitterツイート(2015年2月版) - Qiitaのをコピペして、適当に付け足してできました。

<?php
$head = '';
$body = '';
$foot = '';
if(rand(0,1) == 0) $head .= 'にゃ';
else $head .= 'に゛ゃ';
$max = rand(1,10);
for($i = 0;$i < $max; $i++){
	switch (rand(0,10)) {
		case 0:
			$body .= 'にゃ';
			break;
		case 1:
			$body .= 'に゛ゃ';
			break;
		default:
			$body .= '~';
			break;
	}
}
if(rand(0,1) == 0) $foot = '~';
else $foot = 'ん';
$text = $head . $body . $foot;

// OAuthライブラリの読み込み
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//認証情報4つ
$consumerKey = "XXXXX";
$consumerSecret = "XXXXX";
$accessToken = "XXXXX";
$accessTokenSecret = "XXXXX";

//接続
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

//ツイート
$res = $connection->post("statuses/update", array("status" => $text));

//レスポンス確認
var_dump($res);
?>

ね?簡単でしょ?

人工知能でできること

今日は今後の目標と人工知能の歴史、未来について書きます。技術系の記事ではありません。

さて、未来を予測するには、過去と現在を踏まえる必要があります。
当然、積み重ねですから。歴史については人工知能の歴史 - Wikipediaを参照した方が早いと思います。


と、言うわけで、大雑把に話します。
まず、人工知能という呼び名で命名されたのは1956年です。
しかし、古代から同等の概念があり、それに対して様々なアプローチがされてきました。

現在の人工知能の土壌となった考え方は数多くあり、その中でも多くの数学者たちが「思考を体系的に行う」ことについて考えていたことは重要です。
また、人工知能とコンピューターには多くの共通点が存在し、その双方に貢献したアラン・チューリング - Wikipedia
の名前は覚えて損はないでしょう。
彼は、チューリングマシン(アルゴリズムを実行するための計算機)や、チューリングテスト(人とコンピューターの区別ができるか)、チャーチ=チューリングのテーゼ(計算できる関数を帰納的関数と同一視する)など、この分野の発展に大きく貢献しました。
数学とコンピューターを結び付けて考えられるようにしたことは特記すべきでしょう。

生物からのアプローチとして、1943年に形式ニューロン(神経細胞)が発表され、これがニューラルネットワーク(神経回路網,生体の脳のモデル化が目標)の基礎となりました。
これらは話題になっているディープラーニングの基です。ジェフリー・ヒントン - Wikipediaについても見ておくことを推奨します。アラン・チューリングに次ぐ(あるいは超える)革命の親とも言えるかもしれません。


そして人工知能の未来ですが(僕の予測になりますが)、まず隠れた性質を発見することが目的のものを用いて、地震予知マーケティング(売れる弁当と天気の相関など)、機械の設計(より良い性質を合算していく)などがまず上がります。
それから人工'知能'らしいものとして、自動推論(そしてそれをコード化)、会話できるもの、研究に関する論文の抽出を上げられます。
非常に優秀な助手が来るイメージですね。
これらは既存の技術で十分に可能なはずです。

あとはアンドロイド、人工生命あたりでしょうか。(完全に筋の通った)会話ができるものを一から構築する試みはもう少し時間がかかると思います。
主だったものでもこれだけありますし、ゲームのRTAにも使えます。

最初に目標は会話できるもの、としましたが具体的にアップデートすると、ディープラーニングないしそれを発展させたものを構築することです。完成には時間がかかると思われますが近況をあげつつ技術のステップアップができればと思います。
その初歩となるものに数学がとても使われていて微積から勉強を始めることに…数式を見ると眩暈が…

人工知能学習1

今日は強化学習の一つであるε-greedy法で多腕バンディット問題を解きます。

これは、複数のアーム(腕)から最良のものを選択する問題です。

見えていない確率を払い戻しを元に推定していきます。

もともと、スロットマシン(バンディットマシン)での問題だったので、こう呼ばれているようです。

さて、実際に使うε-greedy法は、貪欲法と呼ばれるgreedy法を拡張したもので、greedy法が最も価値の高いものを(一定期間の学習を経たあと)選び続けるのに対し、こちらは学習しつつ最も価値の高いものを選択します。

これにより長期的に払戻額が大きくなるような選択を(最良の選択を)できる確率が高まります。

具体的なアルゴリズムは、

1.まだ選んでいない手があるならその中からランダムに選ぶ

2.確率εで全ての手の中からランダムに選ぶ

3.そうでなければ最も価値の高い手を選ぶ

となっています。

import java.util.Random;

public class e_greedy {

	public static void main(String[] args) {
		Random r = new Random();
		double e = 0.1d;//確率ε
		int gene = 100;//繰り返す(世代を重ねる)回数
		double[] table = {0.6 , 0.5 , 0.4};//確率テーブル(バンディット),払戻額は同じとします
		int[][] log = new int[table.length][2];//選んだ回数と払い戻された回数なので2
		int myarm = 0;
		for(int g = 0;g < gene;g++){//世代数分ループ
			double[] winrate = new double[table.length];//ここから勝率,上書きするので後ろから
			for(int i = 0; i < table.length;i++){
				if(log[i][0] != 0){
					winrate[i] = log[i][1] / (double)log[i][0];
				}
			}
			for(int i = 0; i < winrate.length;i++){
				if(winrate[myarm] >  winrate[i]) continue;
				if(winrate[myarm] == winrate[i] && r.nextDouble() <= 0.5d) myarm = i;
				if(winrate[myarm] <  winrate[i]) myarm = i;
			}
			if(Math.random() <= e) myarm = r.nextInt(table.length);//確率εでランダム
			
			boolean[] zerolist = new boolean[table.length];
			int countzero = 0;
			for(int i = 0; i < table.length; i++){//まだ出していない手をリストに
				if(log[i][0] == 0){
					zerolist[i] = true;
					countzero++;
				}
			}
			
			if(countzero!=0){
				while(true){	
					int tmp = r.nextInt(table.length);//乱数を出してまだ出していない手をランダムに
					if(zerolist[tmp]){
						myarm = tmp;
						break;
					}
				}
			}
			log[myarm][0]++;
			if(r.nextDouble() <= table[myarm]) log[myarm][1]++;
			System.out.println("Gene : " + g + " myarm : " + myarm);
		}
		
	}

}

greedyアルゴリズムは適当に100世代分くらい均等に選んでからそれのみを選択するという手法で簡単にできると思います。

世代の進行と最適化をグラフ出力したかったのですが断念

ライブラリの導入がめんどくさいので...Pythonなら楽そうなんだよなぁ...

人工知能開発0

のんびりやろうと思いつつ日課にしたい気持ちもあり、とりあえず目標をたてます。

このブログの対象は(当然)初心者向けになるので、ざっくり「会話できるものを作る」とします。

 

とはいっても、まず「人工知能とはどういったものなのか」という疑問があると思います。

Wikipediaをみてみると、「日常語としての『人工知能』という呼び名は非常に曖昧なものになって」いるそうなので、「考えて、答えを出すもの」としておきます。

「考えるとは何か」などといった問いは哲学者に任せます。

「何ができるか」と言われても天気と弁当の売れ行きの相関だとかコンピュータ将棋だとか、様々です。最終的に人間の(あるいはそれを超える)知能を作ろうという試みですから当然ともいえます。

 

 

さて、まず人工知能は2パターンに分類されます。一つが「教師あり学習」、もう一つが「教師なし学習」です。

 

教師あり学習は、問題と答えの組が与えられて、それを基に学習します。子供の頃、1+1=2,1+2=3...と学習したように、コンピュータに学習させます。入力に対して(常に)正しい出力を返すことが目的です。

 

それに対して、教師なし学習は与えられた問題のみで考えます。データをどう分類するか、ゲームをどうやってクリアするか、等。正答が決まっていない問題について考えることが目的です。

 

説明しようとすると自分の理解の浅さを実感しますが、実際に作ればわかると思います。多分。

 

開発はjavaで行うつもりです。Pythonを使ってみたいですがハードルあげすぎても(僕が)詰まると思ったので。

まあプログラミングはおまけなので、まあ、うん。

頑張ります。

ブログの方針

人工知能とプログラミングの初心者がなんやかんやして成長しようとするモチベを上げるためのブログです