민지(MINJI)의 기본 개념에 대하여(2. cell의 구조와 원리).
셀(cell)은 MINJI 시스템의 핵심요소로서 '두뇌 세포' 라고 할 수 있습니다.
그냥 개념만 놓고 보면 기존 딥러닝 신경망 구조의 '노드'에 해당 한다고 볼 수 있습니다만, 기존 방식의 경우 노드란건 단순한 에너지 통로의 역할 이었다면, cell의 경우 일단 '무제한의 자유로운 연결과 학습'을 위해 그보다 훨씬 복잡하고 다양한 기능을 내장하고 있습니다.
우선 소스 코드 차원에서 cell은 그 자체로 class로 잡혀 있습니다.
당연히 그 안에 여러 변수와 함께 메소드가 자리잡고 있죠.
class BrainNetworkEngine {
public:
class CellConn; // 계열 클래스 액세스용 전방 선언.
// 🧠 1. 단일 의미 세포 (Node)
class Cell {
private:
uint32_t id;
char alias[NICKNAME_LENGTHc];
fixed64_t pThreshold;
fixed64_t nThreshold;
fixed64_t energy;
uint64_t connOffset;
bool activeFlag;
bool execFlag;
uint32_t execBlockOffset;
bool patternFlag;
uint16_t idleLoginCount;
bool isAllocated;
public:
void initCell(uint32_t newID);
void setID(uint32_t newID);
uint32_t getID() const;
uint64_t getConnOffset() const;
void setConnOffset(uint64_t offset);
void setAlias(const char* name);
const char* getAlias() const;
void setActive(bool flag);
bool isActive() const;
void toggleActive();
void setExecFlag(bool flag);
bool isExec() const;
void setExecBlockOffset(uint32_t offset);
uint32_t getExecBlockOffset() const;
void setEnergy(fixed64_t e);
fixed64_t getEnergy() const;
void addEnergy(fixed64_t e);
void subEnergy(fixed64_t e);
void setPThreshold(fixed64_t p);
fixed64_t getPThreshold() const;
void setNThreshold(fixed64_t n);
fixed64_t getNThreshold() const;
bool isOverPThreshold() const;
bool isUnderNThreshold() const;
bool decayEnergyLinear(fixed64_t decayDelta);
void resetIdleCount();
uint16_t getIdleCount() const;
void addIdleCount();
void setIdleCount(uint16_t count);
int32_t findConnection(CellConn* connPool, uint32_t targetID, int* outSlot) const;
bool addConnection(CellConn* connPool, size_t connPoolSize, uint32_t sID, uint32_t tID, fixed64_t w, uint8_t assoc);
bool removeConnection(CellConn* connPool, uint32_t targetID);
fixed64_t getWeightTo(CellConn* connPool, uint32_t targetID) const;
bool addConnectionByAlias(Cell* cellPool, size_t cellPoolSize, CellConn* connPool, size_t connPoolSize, uint32_t sID, const char* targetAlias, fixed64_t w, uint8_t assoc);
bool isConnectedToAlias(Cell* cellPool, size_t cellPoolSize, CellConn* connPool, const char* targetAlias) const;
bool trainHomonymInhibition(Cell* cellPool, CellConn* connPool, size_t connPoolSize, const uint32_t* homonymIDs, int homonymCount, fixed64_t learningRate);
void setPatternFlag(bool flag);
bool isPattern() const;
void updateBitmapState();
void setAllocated(bool flag);
bool getAllocated() const;
};소스코드에서 보시듯, cell 클래스(BrainNetworkEngine : 제미나이에게 맡겼더니 유치한 이름을 지었네요)
안에는 기본적으로 셀 자체의 고유 식별 코드인 ID를 시작으로, 사용자가 식별하기 위한 alias, 셀의 발화 기준점인 음/양 두 종의 pThreshold, nThreshold 가 있고, 현재의 셀의 에너지준위를 나타내는 energy 가 각각 Fixed64(64비트 고정소숫점 객체)로 잡혀있으며, 다른 객체와의 연결 정보와 해당 연결에 설정된 가중치 값에 대한 정보의 위치를 나타내는 connOffset 이 64비트 인덱스 값으로 잡혀 있습니다.
아래는 바로 그 외부 객체들과의 연결및 그에 따른 가중치 설정 정보를 관리하는 '셀 연결정보 클래스'의 내용에 대한 소스코드 입니다.
아울러, 특이 사항으로 내부적으로 '실행코드 유닛' 이라고 부르는 vCPU 와의 연결에 관련 항목이 있습니다.
먼저, 셀 자체가 활성화(발화) 되었을때 알려주는 bool activeFlag가 있고, 셀이 활성화 되었을때 vCPU를 실행 시킬지를 결정하는 bool exeFlag가 있습니다.
그리고, 해당셀과 동반한 vCPU의 위치를 알려주는 uint32_t execBlockOffset 이 있습니다
class CellConn {
private:
fixed64_t weight[MAX_CONN_A_UNIT];
uint32_t sourceID[MAX_CONN_A_UNIT];
uint32_t targetID[MAX_CONN_A_UNIT];
uint8_t association[MAX_CONN_A_UNIT];
int32_t toPrevious;
int32_t toNext;
bool tokenFlag;
uint8_t reserved[7];
public:
void reset();
bool isFull() const;
bool isEmpty() const;
int getUsedCount() const;
int findEmptySlot() const;
int findTarget(uint32_t tID) const;
bool connect(int slot, uint32_t sID, uint32_t tID, fixed64_t w, uint8_t assoc);
void disconnect(int slot);
uint32_t getSourceID(int slot) const;
uint32_t getTargetID(int slot) const;
void setSourceID(int slot, uint32_t sID);
void setTargetID(int slot, uint32_t tID);
uint8_t getAssociation(int slot) const;
void setAssociation(int slot, uint8_t assoc);
fixed64_t getWeight(int slot) const;
void setWeight(int slot, fixed64_t w);
void addWeight(int slot, fixed64_t w);
void subWeight(int slot, fixed64_t w);
void applyDecay(fixed64_t decayRate);
void decayWeightLinear(int slot, fixed64_t decayAmount);
void multiplyWeight(int slot, fixed64_t rate);
void setNextChunk(int32_t relativePos);
int32_t getNextChunk() const;
void setPrevChunk(int32_t relativePos);
int32_t getPrevChunk() const;
bool hasNext() const;
bool hasPrev() const;
};기본적으로 '셀 연결정보 클래스'인 CellConn 클래스는 개당 64개의 외부 객체와 연결이 가능하며, 추가 필요시 64개 단위로 무한 확장이 됩니다.
이와같이 cell은 CellConn 모듈을 사용하여 64개 단위로 다른 객체(cell)들과의 어떤 대상이건 무제한 연결이 가능하게 되어 있습니다.


그리고 학습 조건에 따라 cell이 활성화 될 경우 미리 프로그램된 vCPU 모듈을 실행시켜서 정해진 처리를 하거나, 복잡한 '절차 처리'를 할 수도 있습니다.
바로, 어떤 셀과도 자유롭게 연결될수 있는 구조와 함께, 신경망 구조의 한계를 뛰어넘도록 만들어 주는 vCPU의 존재야 말로 기존의 딥러닝 기반의 A.I 시스템들이 갖지 못한 MINJI 만의 독자적인 구조입니다.
vCPU : vCPU는 cell과 동반하여 정해진 기능을 수행하기 위한 가상 CPU로서 독자적인 128비트 명령어 체계를 갖춘 독립된 작은 컴퓨터라 할 수 있습니다.
vCPU는 셀을 학습 시킬때 해당셀의 목적에 따라 '해당 셀이 활성화 되었을때 할 일'을 프로그램 하기 위한 블록입니다. (vShell을 사용하면 학습과 함께 vCPU의 코딩을 하여 특정 셀의 vCPU에 기능을 부여할수 있습니다)
즉, 목적에 따라 '정밀 연산'을 하거나, '복잡한 절차 처리'를 하거나, 심지어 '외부의 스크립트 코드를 호출'하여 복잡한 일을 하게 만들수도 있습니다.

절차 처리 : 현재 사용되고 있는 LLM등, A.I 시스템은 그 자체로 매우 뛰어난 지능을 갖고 사람들을 돕고 있지만, 그 차신이 뭔가 복잡한 일을 수행하지는 못한다는 문제가 있습니다.
예를들어 '메일이 오면 미리 읽어보고 할부 독촉장이면 휴지통에 버리고, 민정이 한테서 온 내용이면 '애인'폴더에 별도 보관해라.' 라는 식의 믿고 맡기는 일이 불가능하다는 얘기죠.
그냥 당장 계산을 하거나 답을 주거나 이미지를 만들거나 한 가지 씩 밖에 할수 없다는겁니다.
즉, 여러 단계의 고려와 절차가 필요한 일은 할수 없는게 현재까지의 A.I 시스템의 한계였습니다.
vCPU는 바로 그러한 문제를 해결하고, '추측과 통계에 의한 추정이 아니라 정확한 계산'을 할 수 있게 해 주기 위한 장치입니다.
사용자가 셀에 복잡한 절차로 처리해야 하는 일을 시키고 싶다면, 셀에는 처리할 단계를 판단할 학습을 시키고, vCPU에는 해당 단계에 처리할 일과 다음단계를 알려주는 출력을 설정하도록 vCPU를 프로그램 하고, 해당 단계를 알려줄 출력을 CellConn 입력단에 배정해 주어 셀로 하여금 몇단계인지를 인지할수 있게 만들어주면 됩니다.
즉, 셀이 외부 조건에 의해 절차 처리를 해야 한다면, 해당 조건과 함께 기본적으로 vCPU가 CellConn의 특정 입력에 'stage 0'을 가리키고 있을테고, 셀은 외부 조건에 따라 활성화 되어 vCPU를 동작 시키게 됩니다.
그에따라 vCPU는 'stage 0'에 처리할 일을 프로그램에 따라 처리한 다음 출력포트로 'stage 1'을 출력하게 되고, 그에 따라 셀이 'stage 1'의 조건을 확인하고 그에 따른 해당 조건의 상태 추론 과정을 거쳐 다시 vCPU를 활성화 시킵니다.
이런식으로 셀과 vCPU의 조합에 따라 다단계의 복잡한 시퀀스도 추론및 프로세스가 가능하게 됩니다.

오류 없는 연산 : 현재 사용하고 있는 신경망 구조의 A.I 시스템들은 상황에 따라 계산이 필요한 경우에도 그것을 계산하지 않고 추측합니다.
따라서 상황에 따라 부정확한 결과 값을 얻을수도 있습니다.
vCPU와 고정소숫점 연산 로직은 바로 이에 대한 해결책으로서 준비 되었으며, 셀이 '계산이 필요하다' 라는 판단을 하게 되면 그에따라 vCPU를 호출하고, vCPU는 조건에 따라 (에너지 레벨이나 연관셀의 상태등에 따라) 필요한 종류의 연산을 128비트 고정소숫점 체계로 정밀하게 처리하게 됩니다.
현재, 고정소숫점 모듈에는 사칙연산 외에 원주율등의 상수(소숫점 이하 20자리 정밀도)와 지수연산등 고도의 연산 루틴이 이미 준비되어 있으므로 어렵지 않게 연산 기능을 사용할수 있습니다.
P.S : 장기적으로, 시스템의 완성 후에는 현재의 LLM 시스템이 C++, 파이썬 등의 소스코드를 자동 생성하듯 학습을 통해 vCPU와 vShell용의 스크립트 코드를 자동 생성하도록 발전 시켜 나갈 계획입니다.
