関数とは
関数。
数学で見た y = x
みたいなやつ。
今回はこれについて考えていきます。
そもそも関数とは?
関数は、変換する装置のことをいいます。
例えば、同じ値段の商品を2個買ったらいくらになるかを知りたいとします。
2ko_nedan
という関数を作るとしましょう。
2ko_nedan
に 100円
と入れると、200円
が返ってくるようにしたい。
これを
払う金額 = 2ko_nedan(値段)
と表記することにします。
この場合、払う金額
には 200
が入っていてほしいわけです。
中身は自由
たぶん、この関数の中身は y = 2x
(払う値段 = 2 × 値段) なのでしょう。
しかし、重要なのは、中身はどのように定義されていてもいいということです。意図したものが返ってくればいいわけですから。
なので、例えば中身が
4X / 2 + 100 - 100
みたいなものでも、結果が合っていれば問題ありません。(効率的ではないですけどね)
もっと汎用的に
「え? 2個だけとか限定的すぎるって?」
そうですよね。だったら、掛け算という関数を作りましょう。
わかりやすいように、kakezan(値段, 個数)
とします。
中身はどうなるでしょうか?
y = 値段 × 個数
でしょうね。
関数の本質:隠蔽と信頼
ここで強調しておきたいのは、関数は変換してくれれば、その中身が何であれ別に問題がないということです。
そして、関数はその中身を見えないようにして、理解しやすいようにする機能を持っています。
一度中身を作ってしまえば、あとは、その関数に必要な値(引数)を渡したら、期待する値が返ってくる、と信じて使うことができます。
入力がない関数とAI
ここで、以下の関数を考えてみましょう。
pi()
これは円周率を返す関数です。渡す値はありません。
いったん中身を考えずに、この関数を呼び出したとします。すると 1
が返ってきました。
「円周率は 3.14...
なので、全然違う!」
なので、この関数に「円周率はもう少し大きいよ」と教えてあげます。
そうすると次は 3
が返ってきました。
「もう少し大きいよ。」
と教えると、次は 4
が返ってきました。
「少し小さくして」というと、3.5
が返ってきました。
このように、目標値との違いをもとに、関数の中身を自動的にいい感じに変更してくれるものをAI(人工知能)と呼ぶことがあります。
この過程は学習と呼ばれ、目標値との違い(誤差)をもとに、内部のパラメータ(関数の計算方法の一部)を変化させる仕組みを指します。
まとめ
- 関数は、何かを入力すると何かを出力する変換装置。
- 関数を使う側は、中身を知らなくても、使い方(入力と出力)だけ知っていれば利用できる。
- 関数の中身(計算方法)を、目標に合わせて自動的に調整してくれる仕組みがAIの基本的な考え方のひとつ。
ここから先は、読みたい人だけ(ちょっと深く掘る)
先ほどの掛け算関数をもう一度見てみましょう。
kakezan(値段, 個数)
の中身は y = 値段 × 個数
でした。
しかし、よく考えると「掛け算」は「足し算」の繰り返しで表現できます。
なので、より基本的な操作で書くと、kakezan
関数は以下のように定義することもできます。
kakezan(値段, 個数):
合計 = 0 // 合計を記録するものを用意
個数 回繰り返す:
合計 = 合計 + 値段 // 合計に値段を足す
合計 を返す // 最終的な合計を関数の結果とする
ここでの「足し算」もまた、関数と考えることができます。1 + 1
の場合は 2
になる、1 + 2
の場合は 3
になる、といったルール(計算方法)が決まっているわけです。コンピュータ内部では、さらに基本的な回路(それも一種の関数)が足し算を実行しています。
このように、関数の中身は、たいていの場合、より小さな(基本的な)関数の集まりによって書かれることが多いです。
関数とは、
- 渡す値(入力)を決める
- 返してほしい値(出力)を決める
- 実際に返される値を信用して利用する
という考え方によって、複雑で高度な処理を実現するための非常に重要な仕組みなのです。