先日、1アマを受験してきた記事を書きましたが無事合格できておりました。自己採点ではだいたい大丈夫そうということがわかってものの、ちゃんと合格って書いてある紙がやってくるとうれしい。
このあと実際に免許されるには、さらに申請が必要で、免許証が届くのは一ヶ月先とからしい。先は長い。
先日、1アマを受験してきた記事を書きましたが無事合格できておりました。自己採点ではだいたい大丈夫そうということがわかってものの、ちゃんと合格って書いてある紙がやってくるとうれしい。
このあと実際に免許されるには、さらに申請が必要で、免許証が届くのは一ヶ月先とからしい。先は長い。
ちょっと前に電子工学の入門をしたのだけど、理論についてもう少しまとまった知識を身に付けたいと思い、いっちょやってみるかと第一級アマチュア無線技士の資格(いわゆる1アマ)の取得に取り組むことにした。
1アマは、昔は通信術の試験があって、高速なモールス通信を身に付ける必要があり難しかったのが、今は筆記試験だけになりハードルが下がっている。もともと、他の級のアマチュア無線技士の資格はもってなくて前提知識は大してなかったのだけど、きっちり勉強すればなんとかなるやろうと思って一気に一級にチャレンジした。
試験は工学と法規の二科目あるので、それぞれ勉強する必要がある。
法規は基本的に暗記なので、比較的ハードルは低い。工学については、基礎的な電気物理やアナログの電子回路、無線機のしくみや電波の性質について理解する必要があって、ある程度体系的に学んでいく必要がある。
勉強の期間はだいたい3ヶ月くらいだった。最初はとにかく試験範囲を知るべきかと思って、試験範囲を網羅的に解説してくれる本を買ってきて読んでみた。
解説・無線工学 2016/2017: 第1級・第2級アマチュア無線技士国家試験用
この本は400ページくらいあって、読むのに1ヶ月くらいかかった。今思うとちょっと時間をかけすぎてしまったように思う。詳細に解説がのっている本なので、軽く目を通した後で辞書的に使うというのが良さそう。
この本を読んだあとは、評判の良さそうな問題集を買ってきて、繰り返し問いていった。
1周目はざっと問題を問いて、どういう雰囲気の問題がでるのかだけ確認した。2周目は、問題をまちがえた時は問題の解説をじっくり読んで理解するというやり方で問いた。2週目が終ったところでだいたい一度は全範囲を理解しているという状態になったので、記憶に定着するように3週目、4週目と問題を問いていった。範囲が広いので繰り返しやって、頭にすりこんでいく感じになる。はじめは1周やるのに2週間くらいかかってたと思うけど、最後には1週間強くらいで済むようになったので、一応前進している感じはあった。
工学の勉強で特に無線工学を基礎から学ぶ 第1級アマチュア無線技士という有名な解説サイトにお世話になった。過去問に対して、一問一問かなり詳細な説明をしてくれていて非常に助かった。教科書はこのサイトだけでも良いと思う。
法規については、ただ、問題だけみていても条文の前後関係とかが良くわからず難しかったので、教科書として電波法令抄録を購入した。
あと、昼休みと終業時間の二回のタイミングで、ランダムで過去問を一問出題してくれるSlack botを作って活用した。2ヶ月くらいの間、平日は毎日2問は問題を問いていたことになるので、80問くらいになると思う。ちょっとは役に立ったはず。
直前には、過去問を2,3回分くらい問いたりして、やったことのない問題がでてきてもびっくりしないように準備した。
緊張していまいちぐっすり寝れなかった上に、会場が電車で一時間くらいの場所で早起きする必要があり、ずっと眠かった。
今回の試験は工学がちょっと簡単だったように思う。過去問の傾向では2,3問は複雑な計算問題がでてくるのだけれど、今回の試験ではそういった複雑な計算問題はほぼなかった。ただ計算問題の総数自体は例年より増えていた印象。
複雑な計算に時間をとられなかった分、じっくり検算する余裕があったので、そこそこ自信をもって試験を終えられた。B問題では、まったくわからない問題を勘で答えてまちがえたり、慌ててしまい "太陽に照らされている" が正解なところを "太陽に照らされていない" って答えてしまった。
法規のほうは、自信満々で満点やろ!とか思いながら試験を終えたものの、意外と覚え間違いがあり、そこそこ間違えた。試験後に問題と法令と照らしあわせて考えてみたんだけど、思い込みがあるのか、未だにどこを間違ってしまったのかがわからない..。
試験会場では、みなさん試験直前もがっつり計算問題の練習とかして勉強されていて、すげーなって感じだった。僕はとにかく集中できなくて、雑にしか勉強できなかった。試験受けるの学生以来なので、試験官のおじさんのことを思わず先生って認識してしまうということもわかった(「先生なかなかこないなー」って考えたりしてたけど冷静に考えると先生ではなかった)。
今回の試験の問題と回答が公開されたので自己採点をしてみた。結果としては
だった。105点が合格ラインなので、たぶんいけるのではないか。めちゃくちゃまちがってマークしてる可能性もあるので、月末の正式な合格発表を待ちたい。
とにかくまとまった電子工学分野の知識を得たい、ということではじめた1アマチャレンジだけども、その目的はそこそこ達成されたと思う。基礎知識が増えて電気のことや回路の話題が出てもだいたい何を言ってるのがわかるようになった。ただ実際自分で回路を考えたり分析したりするとなると、もう少し勉強が必要そうである。先は長い。
もし合格していれば、無線機を運用する免許を得られるので、せっかくなのだから実際の交信も体験してみたい。くわしい人にどのリグを買ったらいいか聞きたい。短波帯にはそのうち出てみたいけど、設備をそろえるのがたいへんだろうからまずはハンディだろうな〜。
こういう資格試験は目標設定としてはわかりやすく、締切や達成度の指標もあるので、真剣に勉強をつづけることができてよかった。ただ、勉強内容が試験に最適化されがちだし、コストも高いので効率はそんなに良くないかもしれない。
ひとまずは一つおもしろチャレンジが完了したのでほっとした。三ヶ月ずっと勉強してた気がするし、なぜか途中で引越ししたりもしたので、妙にたいへんだった。はー、次は何を勉強しようかという感じだ。ソフトウェア開発とかWeb技術にちょっともどりつつ、もうちょっとデータ見れるように確率統計とかを勉強したい気がしてる。
(参加登録はもう終わってるんですが)、今週末の8/21(日) にはてなオフィスでKyoto.なんかというイベントをやります。Kyoto.なんかはプログラミングやインターネットに関する発表をしあってみんなでわいわいする勉強会です。
スケジュールも決まりました。開催が14時からになりました! なのでおもしろ発表たくさんあるので、参加登録されているかたは忘れずぜひいらしてくださいね!!
当日とびいりのLTも歓迎です!
13:30 | 開場 |
14:00 - 14:10 | オープニング |
14:10 - 14:25 | y_uuki さん サーバ運用スクリプト集がゴミ捨て場みたいになってた話 |
14:25 - 14:40 | kizkoh さん Rust か仕事まわりについてなんか |
14:40 - 14:50 | 休憩 |
14:50 - 14:55 | 鹿くん さん なんか |
14:55 - 15:00 | JPMartha さん なんか |
15:00 - 15:05 | 休憩 |
15:05 - 15:20 | side_tana さん 開発のための開発 |
15:20 - 15:35 | r7kamura さん amakanかwikihubのどちらかについてなんか |
15:35 - 15:45 | 休憩 |
15:45 - 16:00 | moznion さん なんか |
16:00 - 16:05 | PastaK さん なんか |
16:05 - 16:10 | yusukebe さん 憂鬱について |
16:05 - 16:15 | 休憩 |
16:15 - 16:30 | とびいり発表のコーナー |
16:30 - 16:40 | エンディング |
16:40 - 17:00 | バッファ |
17:00 ~ | 懇親会 |
最近あまりインターネット活動してなかった気がするので、突然の近況のご紹介をします。最近は主に引越の準備をしながら、アマチュア無線1級の試験勉強をやってる。
半年くらいずっと引越しがしたかったところ、最近良い部屋がみつかったので、引っ越すことにした。今の家は都会にあって便利なんだけど、ちょっとせまくなってきたし、なんだか都会すぎて息苦しい感じがしてる。前の家は出社するときに毎朝鴨川の様子が見れて良かったのを思いだして、次の家は、多少交通が不便なものの自然が近くにあって、ちょっと広くて南向きに窓がついている部屋にした。出社がたいへんになるけど、まぁ歩けない距離ではないので運動だと思ってがんばりたい。
それとはまったく関係なく、アマチュア無線1級の免許をとろうとしてる。ちょっと前に電子工学の入門をしたのだけど、理論についてもうすこしまとまった知識を身に付けたいと思い、詳しそうな人に相談してみた。そうしたところ、複数の人からアマチュア無線の勉強するのはなかなか良いよという情報を得たので、いっちょやってみるかと思ってとりくんでる。
アマチュア無線は4級から1級まであって、ちょっと電波をだしたいだけなら4級をとればよい。ただ今回は、勉強ということで難しい試験に挑戦してみている。アマチュア無線自体はまじでまったくやったことがないので、試験では爆死する可能性は高いものの、試験の内容自体は交信の経験がなくても理解できるので、やってやれなくはない。昔は通信術の試験というのがあって、かなり高速なモールス信号を聞きとれないと合格できなかったらしいので、これは助かったといえる。
8月の試験に向けて、5月くらいからずっと勉強していて、試験の問題も大方は解けるようになってきた。一方。だいぶ飽きてきているところもあって、本業のWebっぽい勉強をしたら良いような気はしてる。今の段階でも、そこそこ電子工学について勉強できたので、目的ははたせたとも言えるけども、とはいえ、中途半端はよくない。ちゃんとまとまった知識をゲットできたという証がほしいし、勉強しているうちにアマチュア無線をやってみたくなって来たので、もうひとがんばりしたいところ。
試験と引越のタイミングが重なってしまっておいおいーって感じだし、なんか夏は胃腸へのダメージがつらくて息切れしがちなんだけど、なんとか元気にやっています。以上個人の日記でした。
最近は、機械学習とか電子工学とかにちまちま入門してたんだけど、そうすると数学が結構出てくる。一応ふむふむとかいって勉強してるんだけど、とにかくめちゃくちゃ微分積分が苦手だったことを思いだすことになった。積の微分公式がわからなかった時のツイートが以下になります。
ここわからないんだけどって質問したら、それ高校数学やでってなってる..
— hakobe (@hakobe) 2016年1月8日
この状態で応用を学び続けるのは心配だということで、簡単な本を買ってきてちまちま練習問題をすることにした。
1次関数の微分積分、マクローリン展開などによる近似、2次関数の微分積分あたりくらいまでの基本を学べる。この本しか読んでないので他の本と特に比較はできないものの、ポイントおさえつつも、練習問題が難しすぎない感じで勉強しやすかったと思う。
例題と練習問題のセットが70問くらいあって、例題も含めてノートに書いてちまちま問いていくというスタイルで勉強していった。各問は小問にわかれてるので、個別の問題としては250問くらいありそう。
そういう感じでときどき中断したりしながらも3ヶ月くらいとりくんだ結果、ついに最後の問題を解くところまでできた。最後の問題は絶対ちょっとむずかしくしてあって、これまで登場したいろんなテクを活用する必要があって、ラスボス感があった(そして間違えた)。
とにかく基本もおぼつかない状態だったので、一通り学びなおすのに成功したのはめでたい。このあとはたぶん線形代数と確率統計あたりが数学復習チャレンジになってきそう。
今季見るべきアニメを機械学習で推薦する に対してなんか精度評価のしかたおかしくない? とご意見をいただきました (指摘1, 指摘2 )
調べたところたしかにいろいろおかしくて、F値が0.9をこえるスコアも実際よりもかなり高いことがわかったのでご紹介します。ご指摘ありがとうございます :bow: 。
教師データをあたえるときには1とラベル付けされたデータと0と、ラベル付けされたデータの数が同じになるように、オーバーサンプリングしました。
と元の記事にはあったのですが、このオーバーサンプリングが問題でした。オーバーサンプリングを教師データとバリデーションデータに分ける前に行ってしまっていたため、同じアニメの特徴とそのラベルが教師データとバリデーションデータの両方に含まれていました。
教師データに含まれるアニメを正しく分類できるのは当然ですから、教師データと同じアニメをバリデーションデータ含めて分類器を評価してしまうと、当然良い数値が出てしまいます。もちろんこれは妥当な評価ではありません。
この問題をデータを教師データとバリデーションデータに分けた後にオーバーサンプリングするようにして修正しました(コードの様子。この修正によって、より妥当なF値が得られるようになりました。ちなみに、F値は0.6強程度になっていうほど精度は高くないことがわかりました...。これはつらい。
実は精度が悪かったとなるのもくやしいので、そのあと少しチューニングをしました。
サンプルスクリプトもこのチューニングにあわせて更新しました(ただし、僕の好みによる教師データ向けのチューニングですが..)。
現在のところは、バリデーションデータ上で以下のような精度を出せています。
precision recall f1-score support 0 0.93 0.98 0.96 443 1 0.87 0.61 0.72 79 avg / total 0.92 0.93 0.92 522
いろいろ出ていますが、重要なのは 一番左に1 とかかれた行です。F値は0.72程度ですが、precisionはかなり0.9近くまでだせており、現実的には多くとも十数個にアニメを推薦しないと考えるとまちがっても1,2個ということで、ツールが推薦したアニメの妥当性はそこそこ高そうです。一方、recallは0.61とあまり高くありません。本来は気にいると考えられるアニメが、推薦されたアニメと同量近く存在することになります。
F値にもとづいた学習曲線をplotすると以下のようになります。そんなに高くないですね!!
評価方法をミスっていると土台がゆらいしまい、全部ひっくりかえるので妥当性の確認はきちんとしないとですね...。指摘してくださった方々ありがとうございました。
F値は結局そこまで高くなりませんでしたが、precisionはそこそこ出せる分類器を作れました。正直、推薦される件数は少ないのでrecallも追求できればしたいですね。あるいはスタッフの情報からアニメを分類するのはどこかで壁があってもうすこし他の情報が必要なのかもしれません。前の記事のブコメでもスタッフやキャストだけで判断できるか疑問に思われている方がたくさんいました。
思ったより前の記事に反響があってびっくりしました。その上にちょっとミスってたのでつらさ100倍でしたが、チューニングすればぎりぎりゆるせるかなーどうかなーとうくらいになったので許されてい...。もうすこし違った特徴が考えないとかなーと思うので、たまに改良していきたいですね。
Coursera で機械学習に入門成功できたので応用に挑戦してみました。ちょうど季節の変わり目ということで、過去に見て気にいったアニメの特徴を学習して、未知のアニメを、気にいりそうなアニメと気にいらなそうなアニメに分類するツールを作って、ソフトウェアに今季見るべきアニメを推薦してもらいたいと思います。
あるアニメを気にいるかどうかは、話のおもしろさや、絵柄の感じ、キャラクターの魅力などによって決まりそうです。ただ、話のおもしろさや、絵の美しさ、キャラクターの魅力を特徴量として数値化するのはむずかしいので、アニメの映像を制作しているスタッフや会社、声を当てているキャストにフォーカスすることにしました。
Courseraの機械学習のコースでは、特徴として妥当かどうかを判断するのに、人間が同じ特徴を与えられて分類といったタスクが可能かを考えてみよとアドバイスしていました。アニメ作品の制作会社や監督、脚本、出演声優の名前を見ればなんとなく自分に合いそうなアニメかはわかる気がするので、特徴としては良さそうです。
各成分がアニメの制作会社やスタッフ、キャストなどに対応するような、ベクトルを考えます。あるアニメの特徴ベクトルは、そのベクトルによって表現します。ベクトルの各成分の値はその成分に対応するキャストやらが、そのアニメに関係していれば1していなれば0とします。例えば以下のようになります
タイトル属性 | サンライズ | 鳥海浩輔 | 櫻井孝宏 | 中村悠一 | 沢城みゆき | 遠藤綾 | 金元寿子 | ... |
---|---|---|---|---|---|---|---|---|
鉄血のオルフェンズ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | ... |
ワンパンマン | 0 | 1 | 1 | 1 | 1 | 0 | 0 | ... |
おそ松さん | 0 | 0 | 1 | 1 | 0 | 1 | 0 | ... |
ここではベクトルの大きさは7くらいですが、実際にはもっと沢山のアニメ関係者をベクトルに対応づけます。今回は学習に使ったアニメと推薦する対象になる今期のアニメの関係者を、出現頻度のおおいほうから1000くらい選びました。
アニメに関係している制作会社やスタッフ、キャストを自分で調査するのは非常に大変なので、いつもお世話になっているしょぼいカレンダーを利用させていただきました。
しょぼいカレンダーにはアニメ作品ごとのページがあって(例: http://cal.syoboi.jp/tid/3424)、スタッフやキャストの情報がそこにまとめらています。公開されているAPI を利用すれば、この情報を取得できるので利用します。
また、しょぼいカレンダーは各アニメにIDを振ってくれているので、そのIDをプログラム中で特定のアニメを指定するための識別子として利用させてもらいました。
自分の好みを学習して使いたいので、過去に見たアニメに対してラベル付けしていきます。ラベルはそのアニメを自分が特に気にいっていれば1を、そうでもなければ0をつけます。
ラベルづけのために、2013年から2015年に放送されたアニメを順番に表示して評価を入力できる、簡単なスクリプトを書きました。このスクリプトを使って、アニメにどんどん評価をあたえていってるのが以下の画像です。yと入力すれば特に気にいってる、それ以外はそうでもないという意味です。この調子で580個くらいのアニメを評価してラベルを付けました。
ここまでで580個くらいのラベル付きのアニメの特徴ベクトルが得られましたので、このデータに基づいて分類器を構築します。機械学習による分類器の手法をいろいろ試してみましたが、一番うまくいったニューラルネットワークを使った分類器を紹介します。
ニューラルネットワークの分類器を自分で丁寧に作っても良かったのですが、できるだけすでにある物を使うべしと、Courseraの機械学習でもいってましたし、Chainerを使ってみました。
Chainerではニューラルネットワーク自体は以下のように定義します。これは3層のニューラルネットワークになるような計算グラフを構築しています。入力ベクトルの長さを1000としているので、入力層は1000ノードあります。隠れ層は100ノードあって、出力層は2ノードです。活性化関数としてはsigmoid関数を使っています。
出力は長さが2のベクトルになっていて、1番目の成分の値は、入力された特徴ベクトルが0にラベル付けされるべき度数をあらわします。2番目の成分の値は同様に、入力された特徴ベクトルが1にラベル付けされるべき度数をあらわします。
from chainer import Chain from chainer.links import Linear from chainer.functions import sigmoid class AnimeChain(Chain): def __init__(self): super(AnimeChain, self).__init__( l1=Linear(1000, 300), l2=Linear(300, 2) ) def __call__(self, x): h1 = sigmoid(self.l1(x)) o = self.l2(h1) return o
このニューラルネットワークに特徴ベクトルと正解のラベルを学習させるような関数を定義します。この関数では、ある段階でのニューラルネットワークで計算した結果と本来得たい数値の誤差を計算して、その誤差に基づいてニューラルネットワークを誤差が最小になる方向に更新していきます。この時に誤差を計算グラフの逆方向に伝搬させていったりする必要があるのですが、そこはライブラリがうまく隠蔽してくれていて、たくさんコードを書かずにすんでいます。細かなコードの意味はChainerのチュートリアルなどを参考にしてください。
from chainer.optimizers import Adam from chainer import Variable from chainer.functions import softmax_cross_entropy # 各アニメの特徴ベクトルを持つ行列Xと、 # 各アニメへのラベル付けの結果を含むベクトルtを受けとって計算する def train(X, t): model = AnimeChain() # 定義したニューラルネットワーク optimizer = Adam() # Adamという方式を使って最適化する optimizer.setup(model) for e in range(1500): V_X = Variable(X) # 計算グラフに値を与えるときはVariableにくるむ V_t = Variable(np.array(t, dtype='int32')) V_y = model(V_X) model.zerograds() loss = softmax_cross_entropy(V_y, V_t) # 誤差を計算 loss.backward() # 逆伝播させてXの各成分ごとの誤差を計算 optimizer.update() # 得られた誤差にもとづいてパラメータを更新 if loss.data < 0.001: # lossが十分小さくなるまで繰り返す break return model
このtrain関数に対して、用意したアニメごとの特徴ベクトルと、手でがんばって入力したラベルを教師データとして与えることで、その内容を学習した分類器ができあがります。
教師データをあたえるときには1とラベル付けされたデータと0と、ラベル付けされたデータの数が同じになるように、オーバーサンプリングしました。0とラベル付けされたのほうが多かったので、オーバーサンプリングしないとあまり性能がでませんでした(F値で0.6くらいになってだいぶしょぼい)。
用意したラベル付きのアニメの特徴ベクトル群を教師データとバリデーションデータにわけたあと、教師データをつかって学習した分類器でバリデーションデータのラベルを予測できるかどうかを確認しました。評価値としては、F値を使います。
この分類器の学習曲線は以下のようになります。教師データの数を増やせば増やすほど、バリデーションデータにおけるF値が0.9以上となっており、うまく学習できていることがわかります。だいたいサチってそうですが、教師データを増やすともうすこし良くなるかもしれません。
オーバーサンプリングした結果をそのあとシャッフルしていたので、教師データとバリデーションデータに同じデータがはいってそうでした。細かくしらべてますが、こんなにスコアは良くなさそう..。0.7とかくらいでは...。グラフもまちがってそうです。
この分類器を使って実際に僕が今季見るべきアニメを予測しました。
僕が気にいったアニメを学習した分類器の結果なので、他の誰の役にも立ちませんが、自分としてはふむふむ納得という結果が得られました。けいおんの再放送がはいっていますが、ここ3年くらいのアニメしか教師データとしてあたえていないはずなので、これも機械によって予測されているはずです。けいおん最高。
Python3で書いたコードが素朴にGitHubにおいてあります。気がむいたら実行の仕方など書こうかと思います。 READMEに実行の仕方を追加しました。
↑のように雑な紹介しかしていないのに使ってみてくださってる方がいました! 実行の仕方の解説もあってすごすぎる!
続々ためしていただいています
今季見るべきアニメを機械学習で推薦する - はこべブログ ♨b.hatena.ne.jp手元で実行した結果、カードキャプターさくらとけいおん!を見れば良いことが分かった
2016/04/15 20:15
というわけで、Coursera で機械学習を学んだ成果として今季見るべきアニメ推薦くんを作ってみました。アニメの制作にかかわる、キャストとスタッフの人名にもとづいた特徴に基づいた学習で、なかなかの分類精度が出ることがわかりました。(追記: 2016/04/16 13:35 測定がミスっていて精度でているか謎です.. => 精度についての記事 を書きました。) 。そこそこ便利なツールができたと思います。
ここでは一本道で紹介しましたが、実際のところはロジスティック回帰やサポートベクターマシンなどいろんな手法をためしてみたり、あれこれパラメータ変更してみたり試行錯誤を重ねました。一週間くらいはF値が0.6からあがらなくてあきらめかけたものの、ためしにオーバーサンプリングしてラベルが1と0の教師データの割合を1:1にしたところめっちゃくちゃ精度があがったりして、良い学び体験を得られましたこれまちがってそうでした..つらい。
とにかく何か作ってみることには成功したのでニコニコしつつも、よく理解してないところも沢山あることもわかったので、なんか勉強します。