こんにちは、機械学習を完全に理解したtemmaです。
今日はタイトル通り、"機械学習"について完全に理解してみます。
機械
だいたいのものは部分に分けて考えると理解しやすいらしいですから(ホーリズムみたいなのは置いといて)、ここでも"機械学習" = "機械" + "学習"
に分けて考えてみます。
まずは機械です。"機械"とは何でしょう?
Google検索してみます。
なるほど?いくつか重要そうな要素がありますが、とりあえず他のものでも確認してみます。
- Wikipedia
機械、器械(きかい、フランス語、英語、オランダ語:machine、ドイツ語:Maschine)とは、広義には、ある力が有用な働きをなし、あるいは他のエネルギーの形態に変化する力の伝達を行うような装置の総称(Brockhausによる定義)。
通常の用語では機械(machine)は一般に簡単な構造を有する器具(implements)または道具(tools)とは区別され、2つ以上の抵抗物を組み合わせて互いに相関的運動を行う工作物をいう。日本語で「機械」は主に人力以外の動力で動く複雑で大規模なものを言い、「器械」のほうは、人力で動く単純かつ小規模なものや道具を指すことが多い。
- 広辞苑
外力に抵抗し得る物体の結合からなり、一定の相対運動をなし、外部から与えられたエネルギーを有用な仕事に変形するもの。
- 明鏡国語辞典
動力によって作動し、一定の運動・仕事を行う装置
- 新明解国語辞典
作動すると一定の運動を繰り返し、他になにか変化を与えるよう仕組まれた道具。
ここまでで"機械"の要素として、
- 動力を必要とする
- 要素の組み合わせによって構成されるもの
- 一定の運動・仕事を行う
- その結果が有用である
などが挙げられそうです。広辞苑以外では"一定の"と言われているのが興味深いですね。
機
もう少し詳しく見るために"機"の漢字について調べます。
会意形声文字である"機(= 木+幾)"は
「木」の象形(意符) +
{
「細かい糸」の象形 (幺が二つで「わずか」の意味。ここでは、矛が人に近いことを示す) +
「矛(ほこ)」の象形 +
「人」の象形 (戦争中の守備兵の細かな気遣いから「細かな」の意味)
}(音符)
から成り、「細かなからくりをしてある器具・はた織り道具」を意味するようです。
したがって、精密な構造を持ち、複雑な原理で動くものに関しては"機"の字が当てられ、単純なものには"器"の字が当てられます。
機械は"要素の精密な組み合わせ"をもつことが読み取れそうです。
機織り機はこう書くんですね。
械
"械"の字はどうでしょう。
"械(= 木+戒)"も同様に会意形声文字で
「木」の象形(意符) +
{
「矛(ほこ)」の象形 +
「両手」の象形 (武器を手にして「いましめる(同じ過ちを犯さないようにしかる)」の意味)
}(音符)
から成り、「いましめの為に作られた木製の手足かせ」を意味するようです。
そこから転じて「道具」、さらには「しかけ」や「からくり」といった意味を表すようになりました(はずれないようにある程度複雑な作りをしていたからでしょうか?)。
こちらも"機"に近い意味を持つようですが、「しかけ」や「からくり」の言葉が示すように 「目的を達成するための何らかの機構」 というニュアンスを読み取ることができそうです。
ちなみに、"機"も"械"も、木の意符は「木でできたもの」を表すようです。
学習
"機械"についてある程度分かったところで、"学習"についても同様に調べてみましょう。
まずはGoogle先生に聞いてみます。
うーん、"機械"のときとは違って求めている回答ではなさそうです。
他の文献に期待です。
- Wikipedia
学習(がくしゅう)とは、知識、行動、スキル(能力)、価値観、選考(好き嫌い)を、新しく獲得したり、修正することである。生理学や心理学においては、経験によって動物(人間を含め)の行動が変容することを指す。繰り返し行う学習を練習(れんしゅう)という。
- 広辞苑
経験によって新しい知識・技能・態度・行動傾向・認知様式などを習得すること、及びそのための活動。
- 明鏡国語辞典
人間も含めた動物が経験を反復することによって環境に適応した行動などを習得してくこと。
- ニッポニカ
経験を重ねることによって行動が比較的持続的に変化し、安定し、その後の行動に効果を持つようになった場合をさすが、環境の変化に対する生体の一般的な適応やもたらされた行動の変化とは区別される。また、成長に伴う行動の年齢的・発達的変化、老化などからも区別されるが、具体的な事例について、それが学習の結果か、成長の結果かを一義的に決定することは難しい。
"学習"の要素としては、以下の
- 広い意味での (反復的)経験 によるもの
- 行動や知識など様々な変化を伴う
- 目的に適応的である
などが挙げられそうです。どの辞書でもGoggle検索の結果と似たような結果が1つ目の意味に上がっていましたね。(新明解国語辞典はそれだけだったのでニッポニカの一部を抜粋しました。)
学
では、漢字も見てみます。
"学(=臼+冂+爻)"、これも会意兼形声文字で
「頭部が大きく手足のなよやかな乳児」の象形(意符) +
{
「両手で引き上げる」象形
「建物」の象形
「屋根の棟(むね)の千木(ちぎ-屋根の1番高い所に取り付けられた木)のように物を組み合わせた」象形(「交わる」の意味)
}(音符)
から成り、教える者が学ぶ者を向上させる交流の場である建物「がっこう」を意味するようです。
教師から教わり、向上することが「学び」のようですね。
習
最後に"習"です。
"習(=羽+白(曰))"は会意文字で
「重なりあう羽」の象形 +
「口と呼気(息)」の象形
から成り、繰り返し口にして「学ぶ、なれる」を意味するようです。
繰り返すことで「学び」を深めるのが「習う」ことなのでしょうか。"白"は"曰う(言う)"の変形です。
機械学習
ここまでのことを踏まえて今更ですが"機械学習"でググってみます。
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>
だけ消すのを書いて、文章だけ取るようにしました。
以下、アルゴリズム別の新歓特設記事の要約です。
- Lex-Rank
メンバーはそれぞれ自分の興味のある分野での活動に参加しています。チームは主に2つの形態に分かれており、ゲームやアプリなど、作品の制作を複数人で行うプロジェクトと、イラストや音楽、サイバーセキュリティ、アルれており、好きな班に所属して自分の興味のあるテーマに班のメンバーと共に取り組むことができます。もちろん、プロジェクトや班の所属は自由で、必ずそれぞれに所属しなければならないわけではありません。回答はTwitームの展示を行います。
- LSA
入部条件東京工業大学、大学院に在籍していること入部申し込み期間5/1(金)~5/31(日)必要なものインターネット環境*東工大から発行される@m.titech.ac.jpのメールアドレス(mアドレス)*前期会費2,000円手順GoogleフォーpMxosu8VcS_4PoxRm7o13qr6QqhCZdk6Q/viewform]に…liquid1224東京工業大学デジタル創作同好会traP目次traPってどんなサークル?SysAd班らん☆ぷろ入部方法新型コロナウイルス感染拡大に伴う変更点traPってどんなサークルモデリング、競プロ、CTFなどの講習会が行われているほか、すぐに質問できる先輩方もたくさんいるので、成長できる環境が揃っています。新入生のみなさんも、traPで一緒に世界を目指しませんか!時間や場所の予定が決ま止となりました。
- Text-Rank
部内では、初心者向けのプログラミングや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 さんの記事です。お楽しみに!