기계학습에 관한 여러 사람들의 자료를 보고 인공신경망에 대해 알게 되어서 아주 기본적인 신경망의 구조를 조작할 수 있게 만든 프로젝트입니다. 논리회로, 가위바위보와 같이 답이 확실하게 정해진 문제에서는 잘 작동하지만 필기 인식과 같이 규칙이 모호한 문제에서도 잘 작동할지는 모르겠습니다. 사실 필기 인식은 합성곱 신경망이 더 적합할 수도 있습니다. ==사용 방법 [1. 메뉴] 설정, 정지, 실행, 학습을 선택할 수 있습니다. [2. 설정] 뉴런 수 바꾸기 - 입력, 출력 단계를 포함한 모든 층의 뉴런의 수를 바꿉니다. 신경망에 저장된 값은 무작위로 초기화됩니다. 신경망 값 바꾸기 - 신경망에 저장된 값을 바꿉니다. 학습을 거의 완료한 상태에서 처음으로 돌아가고 싶거나 래그가 심하게 발생하면 유용하게 사용할 수 있습니다. 학습 정보 리스트 보이기 - "학습 정보" 리스트를 보이고 멈춥니다. 학습 정보를 입력하는 방법은 입력과 원하는 출력에서의 뉴런의 값을 차례대로 입력하면 됩니다. 예를 들어 NOT 논리회로에서는 (0, 1), (1, 0)인 경우가 있으므로 0, 1, 1, 0을 차례대로 입력하면 되고, XOR 논리회로에서는 ((0, 0), 0), ((0, 1), 1), ((1, 0), 1), ((1, 1), 0)인 경우가 있으므로 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0을 차례대로 입력하면 됩니다. [3. 정지] 학습 횟수 - 학습 정보를 바탕으로 학습을 한 횟수가 나타납니다. 차이 - 모든 출력 층의 뉴런에 대해 ((원하는 출력) - (실제 출력))^2의 합을 나타내므로, 그 값이 작을수록 좋습니다. 차이 그래프 - 차이 밑에 있는 그래프는 실행, 학습을 할 때 모든 차이의 기록을 나타냅니다. 클릭하면 보여서 어느 정도 학습이 되었는지 확인하거나 숨겨서 실행 속도를 빠르게 만들 수 있습니다. 학습 비율 - 신경망에 저장된 값을 바꿀 때마다 이 값을 곱하는데, 쉽게 말하자면 학습 속도와도 비슷하다고 할 수 있습니다. 이 값이 크면 학습이 빨라질 수 있지만 학습 과정이 불안정할 수 있고, 작으면 학습 과정이 안정할 수 있지만 학습이 느려질 수 있습니다. 보통은 0.03처럼 작은 값을 이용하는 것 같습니다. 시험해보기 - 실행과 학습이 멈췄을 때 입력 단계에 있는 뉴런에 원하는 값을 입력해서 출력을 확인할 수 있습니다. 내보내기 - 신경망 정보, 학습 비율, 학습 정보를 문자열로 내보낼 수 있습니다. 가져오기 - 내보낸 문자열을 불러올 수 있습니다. 예제 - 간단한 문제를 불러옵니다. 현재 예제는 3개가 있습니다. [4. 실행] 무작위 학습 정보를 불러와서 학습 없이(신경망에 저장된 값을 바꾸지 않고) 결과가 어떻게 나오는지 확인합니다. 차이가 어느 정도인지 확인할 때 사용할 수 있습니다. [5. 학습] 무작위 학습 정보를 불러와 학습을 하면서(신경망에 저장된 값을 바꾸면서) 결과가 어떻게 나오는지 확인합니다. 처음에 신경망을 만들고 값을 초기화하면 신경망은 아무것도 모르는 상태이기 때문에 학습이 필요합니다. 현재 활성함수는 Sigmoid function(Logistic function)을 사용합니다. [6. 신경망] 신경망의 모습입니다. 뉴런은 무채색 원으로 나타나며, 명도가 낮을수록 0에 가깝고, 명도가 클수록 1에 가까운 값이 저장되어 있습니다. 반올림하여 소수 둘째 자리까지 나타내며 값이 1에 거의 일치하지 않는 경우는 0이 생략됩니다. 뉴런을 연결하는 가중치(시냅스)는 빨간색에 가까울수록 음수, 초록색에 가까울수록 양수, 흰색에 가까우면 0과 비슷한 값이 저장되어 있습니다. 이 값은 뉴런과 다르게 범위에 한계를 두지 않았으므로 Sigmoid function(Logistic function)으로 값을 일정한 범위 내의 수로 바꾼 뒤 색으로 변환하여 사용합니다. Bias(한국어로 뭐라고 부르는지 모르겠지만 이 프로젝트에서는 "가중치2 값" 리스트에 저장되어 있습니다)는 나타나지 않습니다. 가장 오른쪽에 있는 뉴런은 원하는 출력으로, 실제 출력과 비교하기 쉽도록 신경망 바로 옆에 붙여 두었습니다. y좌표<0인 곳을 드래그하면 신경망이 넓거나 길 때 다른 부분을 볼 수 있지만, 저의 귀차니즘 때문에 드래그 스크립트를 대충 만들었으므로 다른 부분(예: 차이 그래프, 여러 가지 버튼)과 겹칠 수 있습니다. 그래서 별로 추천드리고 싶진 않습니다. 이 프로젝트를 만들기 전에, 그리고 만들면서 인공신경망에 대해 수박 겉 핥기식 공부를 하면서 여러 사람들의 도움을 받았습니다. 특히 Nicky Case님의 웹사이트, 유튜브의 3Blue1Brown, carykh, 그리고 누구보다도, 스크래치에서 인공지능에 대해 먼저 연구하기 시작한 분 중 저에게 인공신경망에 관심을 갖게 한 @sy77님께 감사드립니다. 잠깐만요... 10월 초까지 이 프로젝트를 만들고 10월 8일(어제)에 내보내기, 가져오기, 예제 등의 기능을 추가한 뒤 공유했는데 오늘 왜 갑자기 알림이 많이 온 거죠?! 1~2년 전부터 스크래치 활동이 줄면서 원래는 며칠 동안 한 번 확인해도 기껏해야 5개 정도밖에 없었던 알림이 하루에 17개나 왔네요. 휴일이라서 제 프로젝트를 볼 시간이 많아지신 건지, 아니면 제 활동을 보고 프로필로 오셔서 다른 프로젝트를 둘러보신 건지... 17개의 알림 중 이 프로젝트와 관련된 것은 2개밖에 없었지만 그래도 다른 프로젝트에 즐겨찾기와 좋아요를 눌러주신 분들 모두 감사합니다! --18/10/09 ==업데이트 기록 님의 의견을 반영해 신경망을 보이거나 숨길 수 있게 바꾸었으며, 신경망을 자유롭게 움직일 수 있게(이전에는 오른쪽 아래로 드래그할 때 가장 왼쪽 위의 뉴런이 (-240, 0)과 비슷한 위치에 오면 드래그를 하지 못하게 막았습니다.) 바꾸었습니다. --18/10/19