outputtemplate:="%j.%c.eps"; beginfig(1); 〜略〜 endfig;
上のようにoutputtemplateを指定すると、
元々のファイル名が
hoge.mpだったとしたら、
beginfig(1)で指定していた画像は
hoge.1.epsになる。
%jが元のファイル名の拡張子取り除いた文字列
%cがbeginfigの中
になっているっぽい
2014年9月6日
JAWS FESTA Tohoku 2014
これで
得上竜一(とくがみりゅういち) | JAWS FESTA Tohoku 2014
これを喋ってきました。
今回しゃべるにあたって、最先端物産展というトラックだったこともあったので、
最近人工知能界隈は
Softbankがpepper売るとか言ってきたり、
Googleが猫論文出してきたり、
人工知能学会誌の表紙が話題
になったり
と、人工知能が何やら盛り上がっているし、今自分の興味の対象が人工知能だしって言うことで、話してきました。
人工知能がそもそも何だっていうのと、人工知能が今までにどんな問題にぶつかって乗り越えてというのがあったのかという歴史と、
今の技術と、クラウドのインフラがあるからこそ解決出来る事とを考えていくと、
あら、今なら人工知能作ることなんて、自分の技術とお財布でも出来そう。身近になったものです。
しかもこれくらいの金額なら、趣味としても、ビジネスとしても成り立つんじゃない?
というお話でした。
いつも、JAWS-UGで話をする時は話を聞きに来た人のうちの2人だけがめちゃくちゃ面白いって言ってくれて、ほかはポカンとしてるくらいを目指しているのだけれど、今回ははずしました。
話の濃さをミスったという反省があるので、資料は公開しません。
IBMの誇るクイズ王(ワトソン (コンピュータ) - Wikipedia)のソースコード(の一部)がASFに寄贈され、現在も開発が続いているプログラムです。
Mac OSX(10.9.4)でUIMAのサンプルを動かしてみます。
Macと言いつつほぼUnixとして使っているので、Linuxでも同様に動くはずです。
まずはJavaが必要です。手元の環境ではJDKの1.8.0u5が入っていたので、この機会にJava SE Development Kit 8 - Downloadsからダウンロードして1.8.0u20を入れました。
Mac OSXの場合はJavaはインストールしても自動的に変わるわけではないので、
.profileなどに
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home
を追加しておきます。
$ java -version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 java version "1.8.0_20" Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode) $ javac -version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 javac 1.8.0_20
Javaのアップデートが完了したことが確認できました。
Apache UIMA - DownloadsからApache UIMAをダウンロードしてきます。
Apache UIMAには"UIMA AS Asynchronous Scaleout"と"UIMA Java framework & SDK"がありますが、今回はローカルだけで動かすので、"UIMA Java framework & SDK"だけをダウンロードしました。
解凍して、設置した場所(手元では/usr/local/apache-uima)をUIMA_HOMEとして.profile内でexportしておきます。
UIMAには最初から色々と便利なスクリプトが用意されています。
${UIMA_HOME}/bin/documentAnalyzer.sh
実行すると↓こんなWindowが開きました。
Input Directory: ${UIMA_HOME}/apache-uima/examples/data/
Input File Format: text
Character Encoding: UTF-8
Output Directory:${UIMA_HOME}/examples/data/processed
Location of Analysis Engine XML Descriptor: ${UIMA_HOME}/examples/descriptors/analysis_engine/NamesAndPersonTitles_TAE.xml
XML Tag containing Text(option): 空欄
Language: en
と入力して、Interactiveを押すと、なんか入力出来そうなフォームが出てきました。
ここに何か文章を入れるようなのですが、英語で何かを書こうなんて無理なお話です。
そこでピノキオの原作のテキストを数行お借りすることにしました。
How it happened that Mastro Cherry, carpenter, found a piece of wood
that wept and laughed like a child.
Centuries ago there lived--
"A king!" my little readers will say immediately.
No, children, you are mistaken. Once upon a time there was a piece of wood. It was not an expensive piece of wood. Far from it. Just a common block of firewood, one of those thick, solid logs that are put on the fire in winter to make cold rooms cozy and warm.
I do not know how this really happened, yet the fact remains that one fine day this piece of wood found itself in the shop of an old carpenter. His real name was Mastro Antonio, but everyone called him Mastro Cherry, for the tip of his nose was so round and red and shiny that it looked like a ripe cherry.
As soon as he saw that piece of wood, Mastro Cherry was filled with joy.
Rubbing his hands together happily, he mumbled half to himself:"This has come in the nick of time. I shall use it to make the leg of a
table."
このテキストをフォームにペーストして”Analyze”を押すと結果が確認できました。
↓の画像のように、人の名前っぽいところが抜き出せている事が分かります。
こんなにも簡単にテキストの分析が出来るとはという感じで、今後も期待のUIMAのサンプルをいじって遊んでみました。
参考:
UIMA 101: 前編 - UIMAことはじめ
これがちょっと古い情報だったので、今の2.6.0でも同じように出来るのか確かめました。
最近DeepLearningに力を入れているわけですが、広く普及するのかどうか非常に気になるところです。
DeepLearningがこの数年くらいで急に盛り上がってきている気はするけど、
GoogleTrendsに聞いてみたら、なんか不思議な結果
ここまではなんとなくわかります。
といいたいところだけど、2013年の1月から急激に伸びているのがわけわからないんです。
ふとDeepLearningって2013年の1月に出来た言葉なんだっけと考えてしまうくらい急激に伸びている。実際にそれ以前にDeep Learningという言葉があったのかなかったのかちょっと見てみました。
2011/01/01 - 2012/12/31に期間を絞ってみたらやっぱりそんなことはなかったです。良かった。
しかし不思議なのが次のグラフ
なぜにこんなに中国からの検索が多いのか、そして、ついで日本が多いのか、不思議ではあります。
ちなみに近そうなものとして、NeuralNetworkとMachineLearningで見てみると、色々な国で検索されている事が分かります。
Neural Network
Machine Learning
なぜDeep Learningだけ飛び抜けて中国なのかっていうのを考えていた時にふと「
Chinese room - Wikipedia, the free encyclopedia
」を思い出し、DeepLearningで結構な知見を持っているGoogleからの何かのメッセージなのかと思いました。
にしても、どうして中国からが飛び抜けて多いんだろう。。。
何かしらのAMIを作る時、本来使うインスタンスよりも高級なインスタンスを使って、
作成するとコンパイルも早いし便利ですよね。
でも、高級インスタンスを使うと時間は短くなったとしても、お高かったりします。
そんな時にはSpotインスタンス。
Spotインスタンスを使ってAMIを作れば安いし、速度的にも快適なことこの上ないです。
Spotインスタンスならc3.xlargeのお値段でc3.8xlargeが使えます。
しかし、SpotインスタンスでAMIを作る時に気にしなくては行けないのは、途中で落ちてしまう事。
(私はSpotインスタンスは最低価格でしか入札しないんです。)
せっかく作ってたのに、途中で落ちてしまっては元も子もありません。
今回はCloudAutomatorを使って自動的にAMIを作り続ける事をやってみます。
まずはSQSでQueueを作ります。
そしてCloudAutomatorでSQSトリガーのジョブを作ります。
こんな感じで作りました。
ここで大事なのは、トリガーになるQueueと成功時に送るQueueを同じにすることです。
これによって、永久ループが完成します。
永久ループが完成するのは良いのですが、このままではCreateImageのAPIの戻りが成功の場合にジョブは成功とみなされ、成功しましたよのMessageがSQSに投げられてしまいます。
そうすると、またSQSトリガーなので、ジョブが実行されてしまうのですが、AMIを作っている途中にもう一度、Create Imageが呼ばれるとAPIは失敗します。=>このジョブは失敗します。
これを回避するために、2つの方法を取ります。どちらか一方でも良いですし、両方やっても良いです。
1.QueueにDelivery Derayを設定する。
2.失敗時にも同じQueueにメッセージを送る。
1についてはほとんどデメリットはありませんが、DeliveryDerayで設定した時間より短い時間でのAMI作成が出来ません。ただ、そんなに高頻度で作っても仕方ないと思うので、デメリットとは言えないかもしれません。
2については、ジョブを大量に消費してしまう可能性があります。プランによっては致命傷です。
ということで、1と2の両方を組合せて使う事でいい感じにAMIを作る事が出来るはずです。
世代管理の数もうまいこと調整して、環境構築の際に変な事してしまっても戻すとか使っても良いと思います。
ちょっと贅沢にCloudAutomatorを使うとこんな事が出来ました。
いちどこのジョブを作っておけば、インスタンスを変更したり、構築中なタグを用意したりすれば、ずっと使えるジョブになります。
運用ではないですが、準備段階でも使い道がありそうなCloudAutomatorでした。
Azure Machine Learningを使いこなすには、experimentのところにある色々が何かを理解しないとツライかもしれません。逆に理解して入ればAzure Machine Learningの便利さがわかるんじゃないかと思います。
ちゃんとしたAzure Machine Learningのドキュメントはこちら
日本語での呼び方はわかるけど、英語で書かれているせいで分からないなんて事もあるかと思うので、対訳をしようかとも思ったのですが、めんどくさかったので、Google翻訳に入れました。
鉄道模型とか出てるくらいの雑さです。
Google翻訳でWikipedia | ggrks | ||||
Data Format Conversions | データ形式の変換 | ggrks | |||
Convert to ARFF | ARFFに変換 | ggrks | |||
Convert to CSV | CSVへの変換 | ggrks | |||
Convert to Dataset | データセットへの変換 | ggrks | |||
Convert to SVMLight | なSVMLightへの変換 | ggrks | |||
Convert to TSV | TSVに変換 | ggrks | |||
Data Transformation | データ変換 | ggrks | |||
Filter | フィルター | ggrks | |||
Apply Filter | フィルタの適用 | ggrks | |||
FIR Filter | FIRフィルタ | ggrks | |||
IIR Filter | IIRフィルタ | ggrks | |||
Median Filter | メディアンフィルタ | ggrks | |||
Moving Average Filter | 移動平均フィルタ | ggrks | |||
Threshold Filter | 閾値フィルター | ggrks | |||
User Defined Filter | ユーザ定義フィルタ | ggrks | |||
Manipulation | 操作 | ggrks | |||
Add Columns | 列の追加 | ggrks | |||
Add Rows | 行を追加します。 | ggrks | |||
Group Categorical Values | グループカテゴリ値 | ggrks | |||
Indicator Values | インジケータ値 | ggrks | |||
Join | 参加 | ggrks | |||
Metadata Editor | メタデータエディタ | ggrks | |||
Missing Values Scrubber | 欠損値スクラバー | ggrks | |||
Project Columns | プロジェクトの列 | ggrks | |||
Remove Duplicate Rows | 重複行を削除する | ggrks | |||
Sample and Split | サンプルとスプリット | ggrks | |||
Partition and Sample | パーティションとサンプル | ggrks | |||
Split | スプリット | ggrks | |||
Scale and Reduce | スケールと削減 | ggrks | |||
Apply Quantization Function | 量子化機能を適用します | ggrks | |||
Clip Values | クリップ値 | ggrks | |||
Quantize | クオンタイズ | ggrks | |||
Transform Data By Scaling | スケーリングすることでデータの変換 | ggrks | |||
Feature Selection | 特徴選択 | ggrks | |||
Filter Based Feature Selection | フィルターベースの機能の選択 | ggrks | |||
Linear Discriminant Analysis | 線形判別分析 | ggrks | |||
Machine Learning | 機械学習 | ggrks | |||
Evaluate | 評価する | ggrks | |||
Cross Validate Model | クロス検証モデル | ggrks | |||
Evaluate Model | モデルの評価 | ggrks | |||
Evaluate Recommender | 推薦を評価 | ggrks | |||
Initialize Model | モデルを初期化します | ggrks | |||
Classification | 分類 | ggrks | |||
Multiclass Decision Forest | 多クラス決定の森 | ggrks | |||
Multiclass Decision Jungle | 多クラス決定ジャングル | ggrks | |||
Multiclass Logistic Regression | 多クラスロジスティック回帰 | ggrks | |||
Multiclass Neural Network | 多クラスニューラルネットワーク | ggrks | |||
One-vs-All Multiclass | ワンVS-すべての多クラス | ggrks | |||
Two-Class Averaged Perceptron | 2クラスパーセプトロンは平均化 | ggrks | |||
Two-Class Bayes Poit Machine | 2クラスベイズPoit機 | ggrks | |||
Two-Class Boosted Decision Tree | 2クラスブーストディシジョン·ツリー | ggrks | |||
Two-Class Decision Forest | 2クラス決定の森 | ggrks | |||
Two-Class Decision Jungle | 2クラス決定ジャングル | ggrks | |||
Two-Class Logistic Regression | 2クラスロジスティック回帰 | ggrks | |||
Two-Class Neural Network | 2クラスニューラルネットワーク | ggrks | |||
Two-Class Support Vector Machine | 2クラスサポートベクターマシン | ggrks | |||
Clustering | クラスタリング | ggrks | |||
K-Means Clustering | K平均クラスタリング | ggrks | |||
Regression | 回帰 | ggrks | |||
Bayesian Linear Regression Model | ベイズ線形回帰モデル | ggrks | |||
Boosted Decision Tree Regression | ブーストディシジョン·ツリー回帰 | ggrks | |||
Decision Forest Regression | 意思決定森林回帰 | ggrks | |||
Linear Regression | 線形回帰 | ggrks | |||
Neural Network Regression | ニューラルネットワーク回帰 | ggrks | |||
Ordinal Regression | 順序回帰 | ggrks | |||
Poisson Regression | ポアソン回帰 | ggrks | |||
Score | スコア | ggrks | |||
Assign to Clusters | クラスタへの割り当て | ggrks | |||
Score Matchbox Recommender | スコアマッチボックス推薦 | ggrks | |||
Score Model | スコアモデル | ggrks | |||
Train | トレイン | ggrks | |||
Sweep Parameters | スイープパラメータ | ggrks | |||
Train Clustering Model | トレインクラスタリングモデル | ggrks | |||
Train Matchbox Recommender | トレインマッチボックス推薦 | ggrks | |||
Train Model | 鉄道模型 | ggrks | |||
Statistical Functions | 統計関数 | ggrks | |||
Apply Math operation | 数学演算を適用します | ggrks | |||
Descriptive Statistics | 記述統計学 | ggrks | |||
Elementary Statistics | 小学校の統計 | ggrks | |||
Hypothesis Testing T-Test | 仮説検定T検定 | ggrks | |||
Linear Correlation | 線形相関 | ggrks | |||
Probability Function Evaluation | 確率関数評価 | ggrks | |||
Replace Discreate Values | 離散的な値を交換してください | ggrks | |||
Text Analytics | テキスト分析 | ggrks | |||
Feature Hashing | フィーチャーハッシュ | ggrks | |||
Named Entity Recognition | 固有名詞抽出 | ggrks |
ふと、CloudAutomator でAMI作るのって当然Windows Instanceでも大丈夫だよね???
というところから試してみました。
こんな感じでジョブを作って試してみました。
先に結果から言うと、完璧です。
世代管理についても
3世代目作っておいて
4世代目を作ったら
ちゃんと第1世代が消されています。
消し忘れによって、無駄にAMIにかかる費用がかかってしまうなんてことも防げそうです。
1つ2つならまだしも、沢山のAMIを管理している場合は世代管理の消し忘れの防止にもなりそうですし、
めんどくさい作業をやらなくても良いのはやっぱり良いなと思います。
少し気になった点として、1世代目の時だけTagがついていないのはなんでなんだろうというのがありました。
あと、好きなTagが付けられるのですが、一つしか付けられないので、おそらくNameを付けておしまいになってしまいそうです。
Cost Allocationとか使っていると、タグは複数付けられると嬉しいなと思いました。