見出し画像

フィードバックの大切さ

フィードバックは大切だ、という話です

フィードバックとは簡単に言えば「結果を(未来の)原因に反映させる」ということです。より具体的には「やりすぎたら次回は控えめにする」「足らなかったらもっと増やす」という、日常生活でもありふれた「反省に基づく修正」全般が広義のフィードバックに含まれます。

さて、このフィードバック、とある理由で特に日本では十分に活用されていないのではないか、もっと活用すべきではないか、というわけでちょっとそのあたりを考察します。

フィードバックは「人類の基本」ともいうべき

反省とは活かさなければ意味がありません。昔々、
三共胃腸薬のCMで「反省猿」

大鵬薬品 チオビタ 「反省だけならサルでもできる」https://www.youtube.com/watch?v=3RdNFcBIpk8

などでネタにされていましたが、反省から同じ事を繰り返さないように行動ややり方を変えるのは試行錯誤の基本、鉄則です。人間は本来この試行錯誤が得意なはずですが、一部の教師などはいわゆる「超算数」のようにやり方を強制し、試行錯誤する能力を奪っています。


しかし試行錯誤こそが人類の科学技術の発展の原点であり、AIやネットで知識の価値が薄れていく中でもその価値はいまだ健在です。AIをどのように使うべきかはまさに試行錯誤している最中です。これからの時代、公式を覚えることも歴史を記憶することもそれのみでは無価値です。公式は理解して使えてこそ意味があり、歴史もその意味を理解してこそ応用できるのです。関が原の戦いが何年にあったとか、そんな数字だけを覚えていても意味がないのです。そんなものはネットやほんでちょろっと調べれば分かることです。しかし、そこに至る経緯、特に徳川と豊臣の人事の違いや命令系統の違いが歴史を決めました。例えば、豊臣方では戦闘や防衛に直接関与しない淀君が余計な口出しをし、理解もないくせに堀を埋めてしまうことを認め、豊臣方の決定的敗北を招きました。(淀君=今の共産党です)

こういった歴史的事実を現代の意思決定に反映してこそ、知識は価値を持つのです。フィードバックできない/しない知識など宝の持ち腐れというやつです。

ちょっと前に流行った「PDCAサイクル」なるものも、結局は「試行錯誤のフィードバック」を一般化したものです。

フィードバックは数学でも使う

もうひとつ、フィードバックが数学的に応用される例を出しましょう。こちらはフィードバックを用いて2の平方根の近似値を求める方法、プログラムです。


#include <stdio.h>
#include <math.h>
#include <locale.h>
// 平方根を探索で求める b = √a を解く。
// 
// 初期値をx として x = (x + a/x)/2 とするとかなり高速に収束するが、今回は使わない

// >gcc -fexec-charset=cp932 root.c でコンパイルすることを想定。

// 本プログラムは、UTF-8で保存している場合、プロンプトの文字コード設定によっては文字化けする。
// プロンプト側の文字コードを
// >chcp 65001
// のように変更することで対処できる。
// プログラムの方で対処する場合はコンパイルコマンドとして
// >gcc -fexec-charset=cp932 root.c
// のように出力先の文字コードを指定するか
// >gcc -std=gnu99 -DUNICODE -D_UNICODE root.c
// のようにUNICODEプログラムとしてコンパイルする

int main(int argc, char **argv){
	
	int a, count=0;
	double a2, pull, push;
	double x;
	
	setlocale( LC_ALL, "Japanese" );//ロケール(地域言語)を日本語でセット
	
	a = 2;
	push = (double)a/2;
	pull = (double)(-a)/2;
	x = (double)a/2;
	while( x*x>0.00000000000000001 ){
		a2 = ( pull + push) * ( pull + push);
		if( a2 < a ){// 増やすべき
			if( x < 0 ){//今回符号が変わった
				x = -x/2;
			}
			push = push + x;
		}
		else if( a2 > a ){// 減らすべき
			if( x > 0 ){// 今回符号が変わった
				x = -x/2;
			}
			pull = pull + x;
		}
		printf("sqrt %d = %1.10fです\n", a, pull + push );
		count++;
	}
	printf("sqrt %d = %1.10f sample\n", a, sqrt(a) );
	printf("count=%d\n", count );
	
	return 0;
}

擬人化すると、こんな感じで作業を進めています。
・会社(プログラム)で平方根を求める作業をする
・試行錯誤要因として、pullさん(引きとめ役), pushさん(押し進め役)を確保
・作業は二人の数直線上の綱引きとして行う
・pullさんは数直線上で数値の減らし役(左に引っ張る)
・pushさんは数直線上で数値の増やし役(右に引っ張る、押す)
・二人の力を合計して二乗し、多すぎればpullさんが動き、少なすぎればpushさんが動く
・二乗の値が十分に2に近ければ業務完了
です。

2の平方根は無理数といい、小数として完璧に求めることは決してできません。代わりに必要なだけの精度を持った近似値を用いるのが一般的です。この近似値を求めるのが以下のプログラムです。ちなみに、数学的にはもっと効率のよい方法がたくさんありますが、これはフィードバックの説明用に僕が新たに作った(といっても人間がやる作業として普通のアルゴリズム)ものです。

実行してみるとつぎのようになりました。




押し引きが交代するたびに少しずつ増減量を減らしていき、20ステップで無事1.4242まで到達しました。ちなみに、1.4142135624まで到達するのに42ステップかかりますが、コンピュータなので一瞬です。

このように、二つまたはそれ以上の力ややり方を調整しながら、正しい・望ましい状態へ近づけていくのは、答えが見つかっていないとき、答えそのもを探しているときに有効な方法です。

この記事が気に入ったらサポートをしてみませんか?