atolab

モノづくりを楽しむ大学生の備忘録。まだまだ初心者です。お手柔らかにお願いします。

Twitterでbot!

1年ほど前から、twitterを用いて自分でプログラムしたbotを作ってみたいと挑戦していました。現状、報告としてとりあえず現在の状況を書いてみます。

最初はtwitter上で薦められ、日本産の言語であるRubyを用いたbotを作成していました。しかし、twitterAPIを用いた、プログラムによるtweetができませんでした。

それから、しばらく時間を空けて、現在、人工知能と言ったらPythonがライブラリや書籍がそろっており、適していると思いPythonに書き換えてみるとすぐにtweetまですることができました。

現在は、tweepyというライブラリを用いています。

今は、cronによる定期ツイート、tweepyのstreamingAPIを用いたリアルタイムのリプライに返信、mecabの導入などを行うことができます。

今後は、mecabによる自分に向けられたリプライやタイムラインに流れているtweetを形態素解析によりデータを扱いやすくするプログラムを作成し、ひとまずはマルコフ連鎖による自動文章作成をしてみたいと思います。

ゼロから作るDeep Learning

去年、大学の生協で少し安く売っており、前から興味を持っていたので買ったのですが、読む暇もなく帰省中についに読んだので内容を復習程度にまとめます。

パーセプトロン

パーセプトロンとは、ニューラルネットワークの起源となるアルゴリズムで複数の入力信号を1つの出力信号にするもの。

例えば2入力のパーセプトロンは以下のように図示される。
f:id:atmos-tic:20170223130450j:plain
画像の文字が少し違うのは勘弁です。

図の〇は「ニューロン」、「ノード」と呼ばれている。
{ω_1,ω_2}は各入力信号固有の重み。
出力信号yは入力信号に重みを付けた総和がある限界値を超えた場合に1となります。この限界値を閾値と呼び、θする。
数式で表すと以下のようになる。
{
    \begin{eqnarray}
    y=\left\{ \begin{array}{ll} 
    0 & (ω_1 x_1+ω_2x_2 ≦ θ) \\
    1 & (ω_1 x_1+ω_2x_2 > θ)
  \end{array}\right.
\end{eqnarray}
}

入力信号も0または1として、{ω_1,ω_2}、θを定めることでAND、NAND、ORという論理回路パーセプトロンを使うことで表現できる。

バイアス
{
    \begin{eqnarray}
    y=\left\{ \begin{array}{ll} 
    0 & (b+ω_1 x_1+ω_2x_2 ≦ 0) \\
    1 & (b+ω_1 x_1+ω_2x_2 > 0)
  \end{array}\right.
\end{eqnarray}
}
上の式は、先の式を少し変えたもの。入力信号に{ω_1,ω_2}の重みをつけてb(バイアス)を加え、その値が0を上回れば1を出力し、そうでなければ0を出力するというものです。

多層パーセプトロンによるXORゲート
{y=AND(NAND(x1,x2), OR(x1,x2))}
ように組み合わせることでXORの論理回路を作り出すことをできる。これを多層パーセプトロンという。

ニューラルネットワーク
活性化関数
下の図のh(X)を活性化関数と呼ぶ。入力信号の総和がどのように活性化するか決定する関数。
f:id:atmos-tic:20170223155820j:plain
活性化関数は非線形関数であることが重要。活性化関数が線形関数の場合、ニューラルネットワークの層がどれだけ深くしても意味がなくなる。

ステップ関数
{
    \begin{eqnarray}
    h(x)=\left\{ \begin{array}{ll} 
    0 & (x ≦ 0) \\
    1 & (x > 0)
  \end{array}\right.
\end{eqnarray}
}
シグモイド関数
{h(x)=\frac{1}{1+exp(-x)}}
ReLU関数
{
    \begin{eqnarray}
    h(x)=\left\{ \begin{array}{ll} 
    0 & (x ≦ 0) \\
    x & (x > 0)
  \end{array}\right.
\end{eqnarray}
}

損失関数
ニューラルネットワークがどれだけ不正確を表す関数。正確さを扱うのではなく不正確さを扱うのは、この関数を微分しより正確になる方向にパラメーターを調節するのだが、正確さを扱うとこの微分が0になりやすく扱い辛いため。
損失関数が最小となるパラメータが最適なパラメータとなる。

{y_k}ニューラルネットワークの出力、{t_k}は教師データとして
2乗和誤差
{E=\frac{1}{2}\sum_{k}(y_k - t_k)^2}
交差エントロピー
{E=-\sum_{k}t_k\log(y_k)}

今までは、難しい本を何とか読んでいましたがこの本は分かりやすく説明してあり読んでいて楽しかったです。
あとこの記事で初めてLatex使いました。難しいけど、数式を表現できるのはうれしいですね。

またもや撃沈、競技プログラミング

今、帰省の途中なのですが暇すぎで携帯からですが、先日参加した競技プログラミングの概要を紹介します。

 

先日、参加したのは、

ABC 055です。

 

この日は、当日上映開始された、

ソードアートオンライン オーディナルスケール」を、この大会開始の9時まで視聴していました。VRとAR、そして人工知能を題材としていて、個人的にはとても好きな話でした。

 

まぁそれは置いといて、映画視聴後、帰りのバスで問題を開くとその場では最初の3問をすぐ解けたと思い、今回はいけるのではと思ってしまいました。

 

しかし、家に帰り解答を提出してみるとそう簡単には行きませんでした、結局最初の1問のみ正解で、他は答えることが出来ませんでした。

今回の敗因としては、

  • 桁数、オーバーフローに関する知識不足
  • 場合分け

の2つでした。

 

解いた問題の概要としては

1問目 単純な計算問題

2問目 階乗と桁溢れ防止

3問目 適切な場合分けと計算問題 

といった感じでした。

後から考えれば解けるはずの問題でした。悔しいので、これからも少しずつ挑戦していきたいです。

 

競技プログラミングに初参加

先ほど、初めて競技プログラミングの大会に出場してみました。

 

AtCoderさん主催の

AtCoder Beginner Contest 054

に挑戦しました。

結果は時間内に1問しか解くことができませんでした。恥ずかしい限りです。

 

プログラミングを触れ始めてから2年まだまだ実力不足ですね。

今まで、ロボットを動かすためのプログラムしか書いて来なかった僕ですが、そこで触れずに苦手だったものが見えてきました。

  • 標準のライブラリに不慣れ
  • 文字列の扱い

そして、とにかくポインタが一番苦手ですね。これは、今までも使用してきましたがまだまだ苦手ですね。

問題はこの2つまでしか手を触れることしかできませんでした。

1問目はとても簡単な問題でした、といっても練習せずに初参加したので提出まで20分以上もかかってしました。

f:id:atmos-tic:20170211235521p:plain

僕が作成したコードはこんな感じです。

abc054-1

2問目は文字列をそのままマッチングすればよかったものを、数字に置き換えようとしたり、1文字づつマッチングしようとするなどで時間を使ってしまいました。

あと、未だに解決してないのは文字列の入力ができていないことです。コンパイルはできるのですが、プログラムを実行すると途中で止まってしまいます。初歩的な間違いだと思いますので早めに解決したいです。

 

f:id:atmos-tic:20170211235616p:plain

他の問題はまだ見てすらもいないのでここまでに。

次もまた挑戦してみたいです。

 

 

mecabで「すもももももももものうち」

昨年から、小型LINUX PCであるラズベリーパイを使ってtwitter botを作ってみたいと思ってました。

以前、挑戦したときはtwitterでつぶやくまでは届きませんでしたが、今回挑戦してみると意外に簡単にできてしまいました。

ラズパイで呟くまでは他の方のブログなどを参考にしてもらいましょう。(時間があればまとめてみます。)


今回は

MeCab (和布蕪) 

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

という形態素解析という文章を解析するプログラムを使ってみたので紹介します。

形態素解析って何かというとこんな感じです。

このように文章の各単語を分けることでbotが文章の意味を理解しやすくします。

それにしても、これを正しく分けることができることに驚きました。

さて実際にラズパイへの導入です。

インストールは以下のコマンドを打てば終了です。

 ~ $ sudo apt-get install mecab libmecab-dev mecab-ipadic-utf8

あとはコマンド mecab を打つことで上の写真ように好きな言葉を打ち込み形態素解析を行うことができます。


とりあえず、mecabの簡単な紹介の記事でした。
マイクロマウスの方は時間的に難しそうなので来年度は諦めようと思いました。

マイコンから見てみよう(書き込み編)

ハーフサイズに参加するのであれば、サイズ的に電子回路の基板はプリント基板でなければ厳しそうです。

今まで使用したことのあるマイコンはSTM32VLD、STBee、STBeeMiniとすべて市販の開発ボードしか使用したことがありません。そして、開発環境は今までマイコン徹底入門 | STM32で組み込みシステム開発さんに頼りきりでした。以前から自作マイコンボードを使用してみたいという思いがあり、これを期にSTM32マイコンとその開発環境について調べてみました。

 

まず今回はマイコンへの書き込み方法です。

マイコンへの書きこみ方法は今回調べてみただけで以上の4つが出てきました。

DFU(Device Firmware Upgrade)

USBを用いてマイコンのFlashROMにプログラムを書き込む方法です。今まで、この方法でしか書き込んだことがありませんでした。

あらかじめ、マイコン内にDFUプログラムを書き込むことでこの方法が可能になります。以前は他の方法でFlashROMにDFUプログラムを書き込まなければならなかったそうですが、現在はほとんどのチップ購入時にはすでに書き込み済みのようです。それを確認するにはSTMアプリケーションノートAN2606を見ると良いようです。

主に以下のサイトを参考にさせていただきました。

STM32シリーズへの書き込み(DFU編) – ろぼっとぼっと

JTAG(Joint Test Action Group)

JTAGとはこの規格を定めた、団体の名前です。

JTAGはシリアル通信を用いて、IC内部に設けられたテスト用の回路にアクセスし、そのICの端子の状態を操作したり、ICの内部回路と通信することができる技術です。

JTAG技術情報トップ | 特殊電子回路

というようにDFUと違ってデバッグも行うことができます。

純正ST-LINKやSTM32VLDなどを使用することでパソコンとマイコンをつなぐことができます。

SWD(Serial Wired Debug)

ARM社独自の規格です。JTAGから信号線を2本にした通信方式です。

純正ST-LINKなどを用いるだけでなく、STMマイコンをVersaloon化しそれを用いることで書き込みを行えます。

Versaloon化は以下のサイトを参考にするとよいと思います。

Versaloonの導入方法 | マイコン徹底入門

以下のサイトを参考にしました。

JTAG/SWDってなに?

UART(Universal Asynchronous Receiver Transmitter)

デバッグをする時にも使用するUARTですが、プログラムを書き込みにも使用します。

STM32はシステムROM領域(マイコンチップ製造時に書き込み済みのメモリエリア)UARTによるフラッシュROMの更新プログラムが予め記録されています。そのためフラッシュROMに何も記録されていない状態でも、システムROMを起動することにより、外部と通信して、フラッシュROMの更新を行うことができます。

マイコン徹底入門/UART

引用元に書いてありますがJTAGに比べていろいろめんどくさいことがあるそうです。

 

以上のようにマイコンに様々な方法でプログラムを書き込むことができるようです。

できれば、今まで使ってたDFUで書き込みができるようにしたいと思いました。

期末テストが近いのでここぐらいで、、、

 

マイクロマウス

現在、サークルとは関係なく、チームではなく一人ですべて行うマイクロマウスに興味が湧いてきたので、自分の実力を試してみたく来年度、時間を見つけて出てみようかと考えている次第です。

 

今後はマイクロマウスについて知ったことをまとめていくかと思います。

 

まず初めにマイクロマウスについて

マイクロマウス競技は、参加者自らが作った自立型ロボットが自律的に(自分の力だけで)迷路を探索し、 ゴールまでに達する最短時間を競う競技です。

http://www.ntf.or.jp/mouse/index.htmlより引用

だそうです。

競技の内容は、マイクロマウスはマウス自身は最初、迷路の各区画のどこに壁があるか分かりません。最初にマウスが知っているのは、迷路の大きさ、ゴールとスタートの位置です。制限時間内にマウスは迷路内を動きまわり、壁のあるなしを調べ、ゴールまでの経路を探索します。制限時間内に5回走行ができその中でのスタートからゴールまでの通過時間の最短時間が記録になるというものです。

マイクロマウスは大きく、クラシックとハーフサイズに2分されるようです。

それぞれはどう違うのでしょうか。

クラシックとハーフサイズの違いとしては、どちらもマイクロマウスの大きさ、迷路の1区画がハーフサイズがその名の通りクラシックに比べて1/2倍されたものでサイズが違います。

しかし、ハーフサイズは迷路の1区画は小さいが迷路全体の最大の大きさ16区画×16区画とクラシックの8区画×8区画と複雑さが大きく違います。

ハーフサイズの方が上級者向けみたいです。

 

個人的には、ハーフサイズに挑んでみたいと思いますが、時間的にも能力的にも足りなさそうですので、今後も検討してみたいです。