학습된 네트워크
브레인이 .oann을 담는 이유, 정수 연산, 레이어, 실행하기, oa-tool brain net, 제한, 라이브러리에 표시되는 내용.
이 장은 docs/brains/oabrain-standard.md, docs/brains/authoring.md, docs/playing-with-brains.md 문서를 요약합니다. 규범이 되는 텍스트는 이 문서들입니다.
브레인이 네트워크를 쓰는 이유
네트워크는 다른 곳에서 학습시켜 패키지에 담아 배포합니다. 스크립트는 학습된 판단이 필요할 때 네트워크를 호출합니다. 쓸지는 제작자가 정합니다. 기본값은 계속 엔진의 기본 제공 컴퓨터 플레이어이며, 가중치를 담은 브레인을 앉히는 것도 여전히 직접 선택해야 하고, 그것을 실행하는 기기의 컴퓨터 자리 하나에만 해당합니다.
.oann과 정수 연산
네트워크 파일은 형식 1의 .oann입니다. 텐서 타입은 int8, int16, int32 중 하나입니다. 저장된 지수는 -48~16입니다. 입력과 활성값은 int16입니다. 출력은 int16이며, argmax 출력만 int32입니다. 같은 입력은 어느 기기에서나 같은 출력을 냅니다.
다이제스트는 패키징할 때, 설치할 때, 그리고 자리가 브레인을 불러올 때 샌드박스가 열리기 전에 다시 확인합니다. 자리를 64 MiB 넘게 만들 네트워크는 할당하기 전에 거부됩니다. 그 자리는 제거되고 기본 제공 컴퓨터 플레이어가 자리를 유지합니다. 불러오기는 어느 단계에도 속하지 않습니다.
레이어
레이어 종류는 다음 순서와 같습니다. 입력과 활성값은 int16입니다.
| 레이어 | 하는 일 |
|---|---|
dense | 출력은 int16입니다. |
conv2d | 출력은 int16입니다. |
maxpool | 출력은 int16입니다. |
relu | 출력은 int16입니다. |
leaky_relu | 출력은 int16입니다. |
tanh | 출력은 int16입니다. |
sigmoid | 출력은 int16입니다. |
add | 출력은 int16입니다. |
concat | 출력은 int16입니다. |
flatten | 출력은 int16입니다. |
softmax | 출력은 int16입니다. |
argmax | 출력은 int32입니다. |
embedding | 출력은 int16입니다. |
실행하기
brain.network(id)는 핸들을 돌려줍니다. brain.tensor는 숫자 1~4,194,304개로 변경할 수 없는 텐서를 만듭니다. net:run은 네트워크의 입력 이름과 정확히 같은 키를 가진 테이블을 받아 새 테이블을 돌려줍니다. int16 출력은 텐서입니다. argmax 출력은 Lua 정수입니다. brain.grid는 다음 레이어 이름 1~10개로 정사각형 텐서를 만들며, 크기는 8, 16, 32, 64, 128 중 하나이고 기본값은 64입니다. sight, explored, water, height, metal, own, allies, enemies, threat, radar. 표준의 예제는 다음과 같이 샘플 하나를 기록합니다.
brain.record{
features = { sectors = brain.grid({"own", "explored"}, 8) },
decision = 0
}
features는 텐서 1~16개입니다. decision은 정수나 텐서입니다. 경기를 녹화 중이면 이 호출은 학습 샘플을 쓰고, 열린 파일이 없어도 똑같이 검사하고 차감합니다. 옵션으로 네트워크를 쓰지 않게 할 수도 있습니다. me.options를 읽고, 플레이어가 끄면 호출을 건너뛰세요. 네트워크는 그래도 패키지와 함께 불러옵니다.
oa-tool brain net으로 만들기
oa-tool brain net은 opset 11~21의 ONNX 모델을 읽어 .oann을 씁니다. 가이드에 나오는 명령은 다음과 같습니다.
oa-tool brain net MODEL.onnx --calibrate DATA [--out FILE] [--weights int8|int16] [--max-difference X] [--force] [--json]
--weights int16 옵션을 지정하지 않으면 가중치는 int8입니다. --calibrate는 JSON 줄 파일입니다. 보고서는 출력마다 가장 큰 차이, 또는 argmax가 일치하는 샘플 비율입니다. --max-difference는 더 큰 차이를 거부하고 아무것도 쓰지 않습니다. 파일을 networks 아래에 sha256과 함께 적으세요. 바이트의 해시가 그 다이제스트와 같아야 합니다.
제한
파일, 실행, 기록은 다음 크기 안에 있어야 합니다.
| 제한 | 값 |
|---|---|
| .oann 파일 | 최대 64 MiB |
| 파일 하나의 텐서 수 | 2~4,096 |
| 파일 하나의 레이어 수 | 1~1,024 |
| 텐서의 랭크와 차원 하나 | 랭크 1~4, 차원 1~65,535 |
| 파일 텐서 하나의 원소 수 | 최대 16,777,216 |
| dense, conv2d, embedding 가중치 합계 | 최대 8,388,608개 원소 |
| 실행 한 번의 연산 수 | 최대 268,435,456 |
| 네트워크 메모리, Lua 상한과 별도 | 64 MiB(67,108,864바이트) |
| brain.tensor 하나의 숫자 수 | 1~4,194,304 |
| brain.grid | 레이어 이름 1~10개, 크기 8, 16, 32, 64 또는 128. 기본값은 64 |
| brain.record 하나와 기록 파일 | 텐서 1~16개, 최대 4,194,304개 원소. 파일은 1 GiB에서 멈춤 |
플레이어에게 보이는 것
라이브러리는 가중치를 담은 브레인에 네트워크 레이블과 학습된 네트워크 사용({size}) 줄을 붙입니다. 항목에는 브레인의 레벨, 호환 대상, 전체 시야 여부도 표시됩니다. 기본 제공 컴퓨터 플레이어는 계속 맨 앞에 나오며, 플레이어가 다른 것을 고르기 전까지 기본값입니다.