feature image

2020年5月17日 | ブログ記事

機械学習†完全に†理解した【新歓ブログリレー70日目】

こんにちは、機械学習を完全に理解したtemmaです。
今日はタイトル通り、"機械学習"について完全に理解してみます。

機械

だいたいのものは部分に分けて考えると理解しやすいらしいですから(ホーリズムみたいなのは置いといて)、ここでも"機械学習" = "機械" + "学習"に分けて考えてみます。

まずは機械です。"機械"とは何でしょう?
Google検索してみます。

なるほど?いくつか重要そうな要素がありますが、とりあえず他のものでも確認してみます。

機械、器械(きかい、フランス語、英語、オランダ語:machine、ドイツ語:Maschine)とは、広義には、ある力が有用な働きをなし、あるいは他のエネルギーの形態に変化する力の伝達を行うような装置の総称(Brockhausによる定義)。
通常の用語では機械(machine)は一般に簡単な構造を有する器具(implements)または道具(tools)とは区別され、2つ以上の抵抗物を組み合わせて互いに相関的運動を行う工作物をいう。日本語で「機械」は主に人力以外の動力で動く複雑で大規模なものを言い、「器械」のほうは、人力で動く単純かつ小規模なものや道具を指すことが多い。

外力に抵抗し得る物体の結合からなり、一定の相対運動をなし、外部から与えられたエネルギーを有用な仕事に変形するもの。

動力によって作動し、一定の運動・仕事を行う装置

作動すると一定の運動を繰り返し、他になにか変化を与えるよう仕組まれた道具。

ここまでで"機械"の要素として、

などが挙げられそうです。広辞苑以外では"一定の"と言われているのが興味深いですね。

もう少し詳しく見るために"機"の漢字について調べます。

ki_tensyo

会意形声文字である"機(= 木+幾)"は

「木」の象形(意符) +
{
「細かい糸」の象形 (幺が二つで「わずか」の意味。ここでは、矛が人に近いことを示す) +
「矛(ほこ)」の象形 +
「人」の象形 (戦争中の守備兵の細かな気遣いから「細かな」の意味)
}(音符)

から成り、「細かなからくりをしてある器具・はた織り道具」を意味するようです。

したがって、精密な構造を持ち、複雑な原理で動くものに関しては"機"の字が当てられ、単純なものには"器"の字が当てられます。

機械は"要素の精密な組み合わせ"をもつことが読み取れそうです。
機織り機はこう書くんですね。

"械"の字はどうでしょう。

kai_tensyo

"械(= 木+戒)"も同様に会意形声文字で

「木」の象形(意符) +
{
「矛(ほこ)」の象形 +
「両手」の象形 (武器を手にして「いましめる(同じ過ちを犯さないようにしかる)」の意味)
}(音符)

から成り、「いましめの為に作られた木製の手足かせ」を意味するようです。

そこから転じて「道具」、さらには「しかけ」や「からくり」といった意味を表すようになりました(はずれないようにある程度複雑な作りをしていたからでしょうか?)。

こちらも"機"に近い意味を持つようですが、「しかけ」や「からくり」の言葉が示すように 「目的を達成するための何らかの機構」 というニュアンスを読み取ることができそうです。
ちなみに、"機"も"械"も、木の意符は「木でできたもの」を表すようです。

学習

"機械"についてある程度分かったところで、"学習"についても同様に調べてみましょう。
まずはGoogle先生に聞いてみます。

うーん、"機械"のときとは違って求めている回答ではなさそうです。
他の文献に期待です。

学習(がくしゅう)とは、知識、行動、スキル(能力)、価値観、選考(好き嫌い)を、新しく獲得したり、修正することである。生理学や心理学においては、経験によって動物(人間を含め)の行動が変容することを指す。繰り返し行う学習を練習(れんしゅう)という。

経験によって新しい知識・技能・態度・行動傾向・認知様式などを習得すること、及びそのための活動。

人間も含めた動物が経験を反復することによって環境に適応した行動などを習得してくこと。

経験を重ねることによって行動が比較的持続的に変化し、安定し、その後の行動に効果を持つようになった場合をさすが、環境の変化に対する生体の一般的な適応やもたらされた行動の変化とは区別される。また、成長に伴う行動の年齢的・発達的変化、老化などからも区別されるが、具体的な事例について、それが学習の結果か、成長の結果かを一義的に決定することは難しい。

"学習"の要素としては、以下の

などが挙げられそうです。どの辞書でもGoggle検索の結果と似たような結果が1つ目の意味に上がっていましたね。(新明解国語辞典はそれだけだったのでニッポニカの一部を抜粋しました。)

では、漢字も見てみます。

gaku_tensyo

"学(=臼+冂+爻)"、これも会意兼形声文字で

「頭部が大きく手足のなよやかな乳児」の象形(意符) +
{
「両手で引き上げる」象形
「建物」の象形
「屋根の棟(むね)の千木(ちぎ-屋根の1番高い所に取り付けられた木)のように物を組み合わせた」象形(「交わる」の意味)
}(音符)

から成り、教える者が学ぶ者を向上させる交流の場である建物「がっこう」を意味するようです。

教師から教わり、向上することが「学び」のようですね。

最後に"習"です。

syu_tensyo

"習(=羽+白(曰))"は会意文字で

「重なりあう羽」の象形 +
「口と呼気(息)」の象形

から成り、繰り返し口にして「学ぶ、なれる」を意味するようです。

繰り返すことで「学び」を深めるのが「習う」ことなのでしょうか。"白"は"曰う(言う)"の変形です。

機械学習

ここまでのことを踏まえて今更ですが"機械学習"でググってみます。

Wikipediaの冒頭を抜粋すると

機械学習(きかいがくしゅう、(英: machine learning、略称: ML)は、明示的な指示を用いることなく、その代わりにパターンと推論に依存して、特定の課題を効率的に実行するためにコンピュータシステムが使用するアルゴリズムおよび統計モデルの科学研究である。

のように書かれています。

ここでの"機械"はコンピューターシステムでしょう。確かに、動力によって動作し、精緻な部品の(あるいは、プログラムの)組み合わせによって有用な仕事を行います。

では"学習"とは何でしょうか?
"機械"は、前述のように 一定の(予め決められた) 動作を繰り返します。しかし、複雑化する要望に対して、あらゆる可能性を(予め明示的に)網羅することはもはや不可能です。
このことへの対応策として「推論」を導入し、コンピューターに「学習」、繰り返しからパターンを抽出し目的機能を向上させる機能を実現しようというのが"機械学習"ではないでしょうか。

ということで、機械学習を完全に理解しました。

そもそも、機械学習は"Machine Learning"の訳じゃねーか、みたいなやつは忘れてください。

おまけ

機械学習を完全に理解したので、なんか作ろうということでtraPのブログを要約してtwitterに投げてくれるBotを作ってみました。
timesに関しては以下を参考にしてください。

概要としてはGoogle App ScriptでこのブログのRSSを購読し、更新があればそのサイトのarticleタグの中身を要約してtwitterに投げるようになっています。

ってのを想定してたんですが、字数制限的に要約があんまりいい感じじゃないのと、ちょっとめんどくさかったので要約部分だけ「python 要約」とかでググったのを参考に書いてみました。

要約部分はtokernizerにJanome、要約ライブラリにはsumyを使用しました。
形態素解析にはJanome以外にMeCabが候補で、Janomeより早いらしいみたいな話を聞いてたんですが、pythonだけで書かれているJanomeのほうがインポートが楽そうだったのでそっちにしました。あと、原文の文字数的にそれほどパフォーマンスがいらないというのもあります。
sumyはググったらパッと出てきたので。

あと、<article>の中身をinnerTextで取る方針で行ったんですがexample codeとかが入って、要約があれなのでtraQ-Sのコードを参考に<code>だけ消すのを書いて、文章だけ取るようにしました。

以下、アルゴリズム別の新歓特設記事の要約です。

メンバーはそれぞれ自分の興味のある分野での活動に参加しています。チームは主に2つの形態に分かれており、ゲームやアプリなど、作品の制作を複数人で行うプロジェクトと、イラストや音楽、サイバーセキュリティ、アルれており、好きな班に所属して自分の興味のあるテーマに班のメンバーと共に取り組むことができます。もちろん、プロジェクトや班の所属は自由で、必ずそれぞれに所属しなければならないわけではありません。回答はTwitームの展示を行います。


入部条件東京工業大学、大学院に在籍していること入部申し込み期間5/1(金)~5/31(日)必要なものインターネット環境*東工大から発行される@m.titech.ac.jpのメールアドレス(mアドレス)*前期会費2,000円手順GoogleフォーpMxosu8VcS_4PoxRm7o13qr6QqhCZdk6Q/viewform]に…liquid1224東京工業大学デジタル創作同好会traP目次traPってどんなサークル?SysAd班らん☆ぷろ入部方法新型コロナウイルス感染拡大に伴う変更点traPってどんなサークルモデリング、競プロ、CTFなどの講習会が行われているほか、すぐに質問できる先輩方もたくさんいるので、成長できる環境が揃っています。新入生のみなさんも、traPで一緒に世界を目指しませんか!時間や場所の予定が決ま止となりました。


部内では、初心者向けのプログラミングやDTM、イラスト、モデリング、競プロ、CTFなどの講習会が行われているほか、すぐに質問できる先輩方もたくさんいるので、成長できる環境が揃っています。実際に、大学からお絵かも多く所属しており、ICPC(国際大学対抗プロコン)世界大会への出場実績や、CTF国際大会への出場権獲得、日本最高峰であるCTF大会の国際決勝大会で優勝など、世界レベルのチームもtraPに所属しています。チームに加わいる人もいます。チームは主に2つの形態に分かれており、ゲームやアプリなど、作品の制作を複数人で行うプロジェクトと、イラストや音楽、サイバーセキュリティ、アルゴリズムなど、特定のテーマに興味のあるメンバーが法を教えてほしいなどの皆さんの質問に、traPメンバーがお答えします。

テキストの取得

function getRowText(tree) {
    if (tree.children.length <= 0) return tree

    const queue = [...tree.children]
    let now
    while (queue.length > 0) {
        now = queue.shift()
        if (now.tagName == "CODE") {
            now.remove()
        } else {
            queue.push(...now.children)
        }
    }
    return tree
}
getRowText(document.getElementsByTagName("article")[0]).innerText

要約(Python)

import re
from janome.tokenizer import Tokenizer
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer as sTokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer
from sumy.summarizers.text_rank import TextRankSummarizer
from sumy.summarizers.lsa import LsaSummarizer

with open("rowData.txt", "r", encoding="utf-8") as f:
    data = f.read()

data = re.sub("《[^》]+》", "", data)
data = re.sub("[[^]]+]", "", data)
data = re.sub("[|  「」]", "", data)

data = data.split("。")
data = [x + "。" for x in data]

t = Tokenizer()

tokenized = []
tmp1 = []
tmp2 = []

for line in data:
    for token in t.tokenize(line):
        tmp1.append(token.surface)
        tmp2 = " ".join(tmp1)
    tokenized.append(tmp2)
    tmp1 = []

tokenized = " ".join(tokenized)

parser = PlaintextParser.from_string("".join(tokenized), sTokenizer("japanese"))
Lex-Rank

LexRankSummarizer = LexRankSummarizer()
LexRankSummarizer.stop_words = [" "]
summary = LexRankSummarizer(document=parser.document, sentences_count=7)
print("".join(re.sub(" ", "", str(sentence)) for sentence in list(summary)))

# LSA
LsaSummarizer = LsaSummarizer()
summary = LsaSummarizer(document=parser.document, sentences_count=7)
print("".join(re.sub(" ", "", str(sentence)) for sentence in list(summary)))

# Text-Rank
TextRankSummarizer = TextRankSummarizer()
summary = TextRankSummarizer(document=parser.document, sentences_count=7)
print("".join(re.sub(" ", "", str(sentence)) for sentence in list(summary)))

pip install janome sumyすれば動くと思うので、rowData.txtに適当な文章用意して、要約を試してもらえると嬉しいです。

明日は @Hinaruhi さんと @sea314 さんの記事です。お楽しみに!

temma icon
この記事を書いた人
temma

19 生命理工学院

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2017年11月14日
IBIS2017参加報告
Keijan icon Keijan
2020年5月15日
【新歓ゲーム制作特集 第2弾】Inverse製作秘話
Saltn icon Saltn
2020年5月19日
【新歓ゲーム制作特集 第6弾】個人でゲームを作る話
Facish icon Facish
2017年12月26日
RustでMCMC(Metropolis-Hasting)
David icon David
2017年11月4日
文章をよしなに分散表現しよう
David icon David
2020年4月12日
Growl Bassの研究【新歓ブログリレー2020 35日目】
fomalhaut icon fomalhaut
記事一覧 タグ一覧 Google アナリティクスについて