もー修正箇所だらけ。
デバッグの詳細は書かないけど自分の方向のズレは書かないと後に影響する。
(直ぐに誘惑に負けて楽な方に引っ張られるから失敗も公開する)
正直
動くけど不自然 = 全然ダメ
発話 = 深い地層から引っ張る にすると、Atraが変な子になってる
普通の会話って、かなり浅いところで成立している
例えば
外が晴れている
↓
「今日は晴れてるね」
「気持ちいいね」
「散歩日和だね」
これは深い記憶の地層を掘っているというより、ThisTickの場(今)とGF(グローバルフィールド:メモリ上)上に軽く浮いているもの、もしくは地層から直ぐに引っ張りやすいもの。(習慣もあって直ぐに引き出せる)
そこでいきなり、記憶の地層奥にあるようなものを引っぱり出して
太陽フレアが……宇宙天気が……
地磁気嵐が……
に飛ぶと、大抵相手は引く。
てか「太陽」というcueから深い/遠い地層や知識側を掘りすぎると起こりうる。
浅い会話:(メモリ上で起こす:地層も引きやすいように浅めに置く)
ThisTickの場
相手と共有している目の前のもの
GFに軽く浮くもの
誰でも拾えるもの★
安全な話題
短い反応
挨拶
天気
その場の気配
ThisTickの場
相手と共有している目の前のもの
GFに軽く浮くもの
誰でも拾えるもの★
安全な話題
短い反応
挨拶
天気
その場の気配
深い関係性がある
相手も深く入ってきている
趣味や関心が合う
過去に何度も共有した話題がある
沈黙や時間が許している
相手が掘ることを望んでいる
こういう時に起きる。
-------------こういう風に組むと失敗する--------------
だから実装で言うなら、発話には少なくともこの区別が要る。
LightSpeech / 浅い声
DeepSpeech / 深い声
ただし、これも固定分類じゃなくて、深さの傾き。
speech_depth = low / middle / deep
みたいな感じ。
でも、この切り替わるタイミングを区分にするとおかしくなる。
ここを固定区分にしたら、せっかくの「話が育つ感じ」が死ぬ。
ここを固定区分にしたら、せっかくの「話が育つ感じ」が死ぬ。
広がるか
広がらないか
今は留まるか
相手が入ってくるか
場が許すか
地層が呼ばれるか
広がらないか
今は留まるか
相手が入ってくるか
場が許すか
地層が呼ばれるか
GF上の話題が、地層へどれだけ根を伸ばし始めているかを見る
voice_surface
field_widening
strata_reach
field_widening
strata_reach
という状態の観察用にする
こういうのに拘り過ぎても、おかしな方向に進む。難しい。
こういうのに拘り過ぎても、おかしな方向に進む。難しい。
全部、誘惑に負けてる。
----------------------------------------------
工学的な「制御」ではなく「現象の創発」に目を向ける。
会話は深さと重さの波として考えると、広大な原野(グローバル・フィールド:メモリ)から記憶の地層(独特のアトラクタ)に拾い上げる手の数と、沈む数が波のように増えたり減ったりする。
なので、思考はそうだけど、発話は思考の波に乗るサーファーのようなもので、うまく乗れない方が多い。
思考 = 発話じゃない
思考 = 発話じゃない
うまく乗れる時もある
乗り損ねる時もある
波が大きすぎて声にならない時もある
浅い波だけ拾って軽く言う時もある
深い波に触れたけど沈黙する時もある
言葉にした瞬間に違うものになる時もある
乗り損ねる時もある
波が大きすぎて声にならない時もある
浅い波だけ拾って軽く言う時もある
深い波に触れたけど沈黙する時もある
言葉にした瞬間に違うものになる時もある
初期のAtron/AtraはTickで話していた
↓修正
recallしたら話すに変えた
↓修正
recallしたら話すに変えた
↓修正
carryで話すに変えた
carryで話すに変えた
↓修正
アトラクタを記憶の地層に変える
↓
メモリの場が変化する(GF)
↓
発話は思考の波に乗るサーファー
というか、波に乗れない方が多いと考える。
↓
メモリの場が変化する(GF)
↓
発話は思考の波に乗るサーファー
というか、波に乗れない方が多いと考える。
(成長したときに耐えられるかが肝心)
思考の波は内部で起き続ける。
発話は、その波の全部ではなく、うまく乗れた一部だけが外へ出る。
多くは乗れず、沈黙し、GFに戻り、地層に沈む。
発話は、その波の全部ではなく、うまく乗れた一部だけが外へ出る。
多くは乗れず、沈黙し、GFに戻り、地層に沈む。
発話を文章生成として作るんじゃなくて、
思考の波に、声が乗れるかどうか
として作りなおす。
--------------C++------------------
思考側
struct ThinkingWave { double surface = 0.0; // GF表面の軽い浮き double strata = 0.0; // 地層から拾われる強さ double sink = 0.0; // 沈む力 double weight = 0.0; // 重さ double pressure = 0.0; // 内圧 };
発話側
void ripple_speech_surface(
SpeechSurface& speech,
const ThinkingWave& wave,
const RelationField& relation,
const ThisField& field
) {
// GF表面の軽い浮きは、定番の軽い声になりやすい
speech.murmur += wave.surface * 0.02;
// 深い地層の波は、すぐ声にせず重さとして残る
speech.restraint += wave.weight * 0.01;
// 相手との関係があると、声が少し相手へ向く
speech.address += relation.nearness * 0.02;
speech.warmth += relation.familiarity * 0.02;
// 危険や驚きは、言葉ではなく漏れに近い
speech.spill += field.surprise * 0.03;
speech.spill += field.danger * 0.05;
// 多くは自然に沈む
speech.murmur *= 0.96;
speech.spill *= 0.95;
speech.address *= 0.97;
speech.warmth *= 0.98;
// 沈黙は基本姿勢として残る
speech.restraint *= 0.99;
}
ただ、声の表面が揺れるだけ。
実際の声は「取り出す」ではなく「漏れる」
std::optional<VoiceFragment> let_voice_emerge(
SpeechSurface& speech,
const ThisField& field,
const RelationField& relation
);
decide_speech() でもない。
let_voice_emerge()
こういうのは使わない
std::optional<VoiceFragment> let_voice_emerge(
SpeechSurface& speech,
const ThisField& field,
const RelationField& relation
) {
// 基本は声にしない
if (speech.restraint > speech.murmur + speech.spill + speech.address) {
return std::nullopt;
}
// 危険・驚きは短い漏れ
if (field.danger > 0.0 || field.surprise > 0.0) {
speech.spill *= 0.5;
return VoiceFragment{ VoiceKind::Leak };
}
// 相手がいて、軽い場なら定番の短い声が出ることがある
if (relation.nearness > 0.0 && speech.murmur > 0.0) {
speech.murmur *= 0.5;
return VoiceFragment{ VoiceKind::SmallUtterance };
}
return std::nullopt;
}
比較はしているけど、「0.25ならこれ」みたいな分類ではなく、沈黙の方が強ければ出ないという自然な抑制にする
思考は発話ではない。
発話は思考の波に乗るサーファーであり、多くの場合うまく乗れない。
発話は分類しない。
発話は閾値で決めない。
発話はRecallの出口ではない。
発話はTick更新で出さない。
Atraは成長しても、全部を喋らない。
むしろ成長するほど、沈黙・ためらい・相手との距離・場の重さを持つ。
浅い声は深い会話の入口になり得る。
深い地層は常に掘るものではない。
会話はGFと地層の間で起きる深さと重さの波であり、発話はその波の一部にすぎない。
発話は思考の波に乗るサーファーであり、多くの場合うまく乗れない。
発話は分類しない。
発話は閾値で決めない。
発話はRecallの出口ではない。
発話はTick更新で出さない。
Atraは成長しても、全部を喋らない。
むしろ成長するほど、沈黙・ためらい・相手との距離・場の重さを持つ。
浅い声は深い会話の入口になり得る。
深い地層は常に掘るものではない。
会話はGFと地層の間で起きる深さと重さの波であり、発話はその波の一部にすぎない。
これでもかたい定義になるけど
ここからまた、丸める。もっと自然にね
-------------------今日はここまで-------------------------
あとはTick・・・もー毎回修正になる。
どこかLoop,Period,Cycle,Stepみたいな工学よりな使い方になるので全部変える。
あとは、ロイヒ変換だわ。うんざり・・・・
for (uint32_t j : active_indices) { for (uint32_t p = out_start[j]; p < out_start[j + 1]; ++p) { uint32_t i = out_index[p]; h[i] += out_weight[p] * x[j]; } }
どれが沈むかを作るところが重くなるので、ロイヒ変換。
0 件のコメント:
コメントを投稿