<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
	<channel>
		<title><![CDATA[신경망]]></title>
		<link>https://aidev.co.kr/neuralnetwork</link>
		<description><![CDATA[]]></description>
		<language>ko</language>
		<pubDate>Sun, 24 May 2026 22:59:52 +0900</pubDate>
		<lastBuildDate>Sun, 24 May 2026 22:59:52 +0900</lastBuildDate>
		<generator>XpressEngine</generator>
								<item>
			<title><![CDATA[신경망의 동작과정을 3차원으로 시각화한 영상]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/8727</link>
			<guid isPermaLink="true">https://aidev.co.kr/8727</guid>
						<comments>https://aidev.co.kr/8727#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/194/727/008/e8bbc11d2ea7e8226f204213bbfd3145.jpg" alt="K-002.jpg" style="" /></p>

<p>&nbsp;</p>

<p><a href="https://www.facebook.com/groups/TensorFlowKR/permalink/1069473680060356/" target="_blank">https://www.facebook.com/groups/TensorFlowKR/permalink/1069473680060356/</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>신경망의 동작과정을 시각화한 영상입니다. 먼저 28x28 사이즈의 손글씨 데이터인 MNIST를 학습합니다. 그다음 새로운 숫자를 그리면 그 결과를 원핫인코딩 형식으로 출력합니다. 예를 들어, 0000100000이면 그 자리수에 맞는 숫자인 4를 가리킵니다.</p>

<p>&nbsp;</p>

<p>총 3개의 레이어로 구성되어 있습니다. 입력은 784개(28x28), 레이어1은 128노드(16x8), 레이어2는 16노드(4x4), 레이어3는 10노드(0~9)입니다. 그림은 보기 편하게 2차원으로 되어 있지만, 실제로 완전연결신경망은 1차원으로 쭉 늘어져 있습니다. 화면에 보이는 각 픽셀은 이전 입력과 가중치가 곱해진 출력을 나타냅니다.</p>

<p>&nbsp;</p>

<p>사실 사람이 봐서는 중간층의 결과가 어떤 의미인지 알 수 없습니다. 오직 기계만 이해가 가능합니다. 그래서 신경망을 블랙박스라 부르기도 합니다.</p>

<p>&nbsp;</p></div>]]></description>
						<pubDate>Tue, 24 Dec 2019 16:26:06 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[아 오랜만에 글 올려봅니다. 신경망 라이브러리 업데이트했습니다.]]></title>
			<dc:creator><![CDATA[사지방컴]]></dc:creator>
			<link>https://aidev.co.kr/7122</link>
			<guid isPermaLink="true">https://aidev.co.kr/7122</guid>
						<comments>https://aidev.co.kr/7122#comment</comments>
									<description><![CDATA[<div class="xe_content"><p>참고자료 및 버전관리는 링크로 대체합니다.</p>

<p> </p>

<p> </p>

<p>(링크가 오래되어 깃헙링크로 대체합니다.)</p>

<p> </p>

<p>깃헙링크 (다운로드)</p>

<p><a href="https://github.com/RadeonHD6750/ANN-Library-Release">https://github.com/RadeonHD6750/ANN-Library-Release</a></p>

<p> </p>

<p>사용법 링크 (블로그)</p>

<p><a href="https://blog.naver.com/thesuffering/221756140401">https://blog.naver.com/thesuffering/221756140401</a></p>

<p> </p></div>]]></description>
						<pubDate>Fri, 08 Mar 2019 14:56:54 +0900</pubDate>
									<slash:comments>1</slash:comments>
					</item>
				<item>
			<title><![CDATA[인공신경망 라이브러리 버전관리]]></title>
			<dc:creator><![CDATA[사지방컴]]></dc:creator>
			<link>https://aidev.co.kr/5676</link>
			<guid isPermaLink="true">https://aidev.co.kr/5676</guid>
						<comments>https://aidev.co.kr/5676#comment</comments>
									<description><![CDATA[<div class="xe_content"><p>   직접 제작한 인공신경망 라이브러리를 배포하는 글을 작성했었습니다. 하지만, 기간만료로 인하여 문의하는 분이 많이 있습니다. 그리하여 전역한 지금 이제 당당히 무기한 배포를 할 수 있게 되었습니다. 전역은 6월 26일에 했지만, 이제 와서야.....크흠</p>

<p> </p>

<p>   사용법과 레퍼런스는 원문인 제 블로그 링크로 대체하겠습니다.</p>

<p> </p>

<p><a href="https://blog.naver.com/thesuffering/221299679776">https://blog.naver.com/thesuffering/221299679776 </a></p>

<p> </p>

<p>  </p>

<p> </p>

<p> </p>

<p> </p></div>]]></description>
						<pubDate>Thu, 16 Aug 2018 17:54:39 +0900</pubDate>
									<slash:comments>2</slash:comments>
					</item>
				<item>
			<title><![CDATA[직접 C#으로 제작한 인공신경망 라이브러리]]></title>
			<dc:creator><![CDATA[사지방컴]]></dc:creator>
			<link>https://aidev.co.kr/4839</link>
			<guid isPermaLink="true">https://aidev.co.kr/4839</guid>
						<comments>https://aidev.co.kr/4839#comment</comments>
									<description><![CDATA[<div class="xe_content"><h1 style="text-align:center;">서지민 인공신경망 라이브러리</h1>

<p> </p>

<p> </p>

<p> 그 동안 군생활하면서 시간을 쪼개어 제작한 인공신경망 라이브러리입니다. 파일은 Full_Connected.dll과 Jimin_Util.dll입니다.</p>

<p> </p>

<p>링크가 오래되어 깃헙과 제 블로그 링크로 대체합니다.</p>

<p> </p>

<p>깃헙링크 (다운로드)</p>

<p><a href="https://github.com/RadeonHD6750/ANN-Library-Release">https://github.com/RadeonHD6750/ANN-Library-Release</a></p>

<p> </p>

<p>사용법 링크 (블로그)</p>

<p><a href="https://blog.naver.com/thesuffering/221756140401">https://blog.naver.com/thesuffering/221756140401</a></p>

<p> </p>

<p> </p>

<p><span style="color:rgb(0,0,0);"> 이에 대한 레퍼런스는 원문링크를 통하여 대체하겠습니다.</span></p>

<p>https://blog.naver.com/thesuffering/221264164008</p>

<p> </p>

<p>사실 원문은 저의 블로그입니다 ㅎㅎ</p>

<p> </p>

<p> </p>

<div class="autosourcing-stub-extra"> </div>

<p> </p>

<p> </p>

<div class="autosourcing-stub-extra"> </div>

<p> </p>

<p> </p></div>]]></description>
						<pubDate>Fri, 04 May 2018 16:51:13 +0900</pubDate>
									<slash:comments>2</slash:comments>
					</item>
				<item>
			<title><![CDATA[신경망을 이용한 보급품 찾기]]></title>
			<dc:creator><![CDATA[사지방컴]]></dc:creator>
			<link>https://aidev.co.kr/1760</link>
			<guid isPermaLink="true">https://aidev.co.kr/1760</guid>
						<comments>https://aidev.co.kr/1760#comment</comments>
									<description><![CDATA[<div class="xe_content"><p>  안녕하십니까? 얼마전에 가입한 사지방컴입니다. 사지방 '현역' 개발자로써 활동하고 있습니다. 본 카테고리가 정보'공유'라고 되어 있길레 '공유'하기 위하여 글 올려봅니다.</p>

<p> </p>

<p>(프로그램 다운로드 링크 N드라이브)</p>

<p>http://naver.me/FGr3cLos</p>

<p> </p>

<p><strong>개요</strong></p>

<p> </p>

<p>  본 인공지능 프로그램은 인공지능 객체(Agent)가 모기를 피하며 보급품을 찾아 떠나는 내용의 프로그램입니다.</p>

<p> </p>

<p><strong>환경</strong></p>

<p> </p>

<p>  파랑색 캡슐은 모기인 빨강색 캡슐을 피하여 보급품인 분홍색 상자를 찾아 먹어야 합니다. 보급품을 취식하면 보상값 1을 받고 모기한테 물리면 보상값 -1을 받는 환경입니다. 아무 보상도 받지 않다면 보상망에 의하여 보상값이 부여됩니다.</p>

<p> </p>

<p><strong>상태</strong></p>

<p> </p>

<p>  전방좌우로 최대 16개의 레이저를 발사합니다. 측정된 거리의 역수에다 피격된 물체의 가중치를 곱한 값들의 배열로 정의된 상태가 입력됩니다. 모기는 -1, 보급품은 1, 다른 객체는 0.5, 빈 공간은 0.25로 했습니다.</p>

<p> </p>

<p><strong>행동</strong></p>

<p>  </p>

<p>  행동은 총 4가지입니다. 위,아래,왼쪽,오른쪽으로 가는 행동(Action)입니다.</p>

<p> </p>

<p> </p>

<p><strong>학습방법</strong></p>

<p> </p>

<p>  살아있을 때에는 현 정책망과 보상망을 학습하지 않고 행동을 취합니다. 그리고 경험 메모리에 상황을 저장합니다. 벽에 충돌하거나 모기한테 물리면 사망하게 됩니다. 사망하게 되면 살아 생전에 경험했던 것을 되세기며 신경망을 학습시켜 새로운 정책을 만들어내게 됩니다.</p>

<p> </p>

<p>  보상값을 받았다면 정책망에서는 오차신호가되고 보상망에서는 목표값이됩니다.</p>

<p> </p>

<p> </p>

<p>  정책망 오차 신호 = (1 - 출력값<sup>2</sup>) * 보상값</p>

<p> </p>

<p>  보상망 오차 신호 = (1 - 출력값<sup>2</sup>) * (보상값 - 출력값)</p>

<p> </p>

<p><strong>개발환경</strong></p>

<p> </p>

<p><strong>  </strong>구름IDE를 이용하였으며 언어는 C#으로 라이브러리 없이 순수 깡코딩하여 개발하였습니다. 사용한 게임엔진은 유니티 5.6입니다. 개발기간은 혼자서 한달 걸렸습니다. 물론 이것만 만드는데 한달입니다. 여기에 사용한 기반기술들 및 코딩스킬 그리고 저만의 경험은 제외하고서 입니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p><span style="font-size:12px;"> </span><strong>맺음말</strong></p>

<p> </p>

<p><strong>  </strong>앞으로도 다른 인공지능 프로그램으로 자주 찾아뵙겠습니다. 이상 현역으로 복무하고 있는 사지방컴이었습니다.</p>

<p> </p>

<p><strong>  </strong></p>

<p> </p>

<p> </p>

<p> </p></div>]]></description>
						<pubDate>Mon, 17 Jul 2017 04:38:49 +0900</pubDate>
									<slash:comments>6</slash:comments>
					</item>
				<item>
			<title><![CDATA[신경망 퍼셉트론과 XOR 문제 해결 방법]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/1348</link>
			<guid isPermaLink="true">https://aidev.co.kr/1348</guid>
						<comments>https://aidev.co.kr/1348#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><a href="http://egloos.zum.com/greentec/v/4136487" target="_blank">http://egloos.zum.com/greentec/v/4136487</a></p>

<p> </p>

<p> </p>

<p> </p>

<p>퍼셉트론의 단점이 XOR 데이터를 학습할 수 없다는 것이었습니다.</p>

<p>이를 해결하기 위해 히든레이어를 추가하고 오류역전파 방법을 사용합니다.</p>

<p> </p>

<p>위의 링크에서 그림으로 자세히 이해할 수 있습니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>&lt; 인공지능 개발자 모임 &gt;</p>

<p>- 페이스북 그룹에 가입하시면 인공지능에 대한 최신 정보를 쉽게 받으실 수 있습니다.</p>

<p>- <a href="https://www.facebook.com/groups/AIDevKr/" target="_blank">https://www.facebook.com/groups/AIDevKr/</a></p>

<p> </p></div>]]></description>
						<pubDate>Sat, 29 Apr 2017 05:42:13 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[퍼셉트론에 대한 설명과 C++ 코드]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/1021</link>
			<guid isPermaLink="true">https://aidev.co.kr/1021</guid>
						<comments>https://aidev.co.kr/1021#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><a href="http://blog.secmem.org/197" target="_blank">http://blog.secmem.org/197</a></p>

<p><a href="http://blog.secmem.org/199" target="_blank">http://blog.secmem.org/199</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>퍼셉트론은 인공신경망의 한 종류로 1957년 프랑크 로젠블라트(Frank Rosenblatt)가 고안하였습니다.</p>

<p>뉴런에 대한 기본적인 설명과 함께&nbsp;퍼셉트론을&nbsp;C++로 알기쉽게 구현한 글입니다.</p>

<p>&nbsp;</p>

<p>다층 퍼셉트론의 오류역전파 알고리즘까지는 다루진 않았지만</p>

<p>신경망의&nbsp;기초적인 지식을 얻는데 도움을 될 것 같습니다.</p>

<p>&nbsp;</p></div>]]></description>
						<pubDate>Thu, 23 Mar 2017 11:37:50 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[오류 역전파 알고리즘 개요 및 C++ 코드]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/797</link>
			<guid isPermaLink="true">https://aidev.co.kr/797</guid>
						<comments>https://aidev.co.kr/797#comment</comments>
									<description><![CDATA[<div class="xe_content"><p>오류 역전파 설명</p>

<p>-&gt; <a href="http://llnntms.tistory.com/31" target="_blank">http://llnntms.tistory.com/31</a></p>

<p> </p>

<p>오류 역전파 C++ 코드</p>

<p>-&gt; <a href="http://hub-ai.com/annhmmcrt/17009" target="_blank">http://hub-ai.com/annhmmcrt/17009</a></p>

<p> </p>

<p> </p>

<p> </p>

<p>오류 역전파(Back Propagation)은 신경망 학습의 가장 대표적인 학습방법 입니다.</p>

<p>기본적인 아이디어는 실제 출력과 목표 출력의 차이인 오차가 낮아지도록 가중치를 수정하는 것입니다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/797/115db5390f7dc2c56b8af5ef385f4ea8.png" alt="그림_2.png" style="" /></p>

<p>위의 그림처럼 가중치(w)와 오차(E)가 함수로 주어졌을때 </p>

<p>경사 하강법을 사용하여 오차가 가장 낮아지는 신경망의 가중치를 찾는 것이 목표입니다.</p>

<p>아래 링크는 경사 하강법에 대한 자세한 설명입니다.</p>

<p> </p>

<p>http://aidev.co.kr/bigdata/806</p>

<p> </p>

<p> </p>

<p> </p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/797/7693cbf8085cac254bfc741a23a80775.jpg" alt="다운로드.jpg" style="" /></p>

<p> </p>

<p> </p>

<p>위와 같은 신경망에서 오류 역전파로 가중치 w5 를 구하는 공식은 아래와 같습니다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/797/f89006401c98a7d2ec5a1d00ca0e1c5a.png" alt="math_uf_1483801989244.png" style="" /></p>

<p> </p>

<p>경사 하강법으로 오류를 가중치로 미분하면서 가중치를 조정합니다.</p>

<p>그 다음 수식 계산이 복잡한데 최종적으로 나오는 결과는 아래와 같습니다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/797/8a6d9417ab012d769d2add77d88fd5d1.png" alt="K-002.png" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p>상단 링크에 있는 C++ 코드와 위의 수식을 비교해 보시길 바랍니다.</p>

<p> </p>

<p> </p>

<p> </p>

<p>&lt; 인공지능 개발자 모임 &gt;</p>

<p>- 페이스북 그룹에 가입하시면 인공지능에 대한 최신 정보를 쉽게 받으실 수 있습니다.</p>

<p>- <a href="https://www.facebook.com/groups/AIDevKr/" target="_blank">https://www.facebook.com/groups/AIDevKr/</a></p>

<p> </p></div>]]></description>
						<pubDate>Tue, 07 Mar 2017 03:15:54 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[파이썬 코드로 뉴럴 네트워크를 만들어보자]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/703</link>
			<guid isPermaLink="true">https://aidev.co.kr/703</guid>
						<comments>https://aidev.co.kr/703#comment</comments>
									<description><![CDATA[<div class="xe_content"><p>1편 :&nbsp;<a href="http://ddanggle.github.io/ml/ai/cs/2016/07/16/11lines.html" target="_blank">http://ddanggle.github.io/ml/ai/cs/2016/07/16/11lines.html</a></p>

<p>2편 :&nbsp;<a href="http://ddanggle.github.io/ml/ai/cs/2016/09/03/13lines.html" target="_blank">http://ddanggle.github.io/ml/ai/cs/2016/09/03/13lines.html</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>파이썬으로 간단한 신경망을 구현하는 방법입니다.</p></div>]]></description>
						<pubDate>Tue, 28 Feb 2017 03:21:45 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[뉴럴네트워크 코드 짜는 법 배우기]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/702</link>
			<guid isPermaLink="true">https://aidev.co.kr/702</guid>
						<comments>https://aidev.co.kr/702#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><a href="http://ddanggle.github.io/ml/ai/cs/2016/07/16/LearningHowToCodeNeuralNetworks.html" target="_blank">http://ddanggle.github.io/ml/ai/cs/2016/07/16/LearningHowToCodeNeuralNetworks.html</a></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>신경망과 역전파 알고리즘에 대한 설명입니다.</p></div>]]></description>
						<pubDate>Tue, 28 Feb 2017 03:21:21 +0900</pubDate>
									<slash:comments>1</slash:comments>
					</item>
				<item>
			<title><![CDATA[인공신경망을 이용한 마우스 제스쳐 인식]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/454</link>
			<guid isPermaLink="true">https://aidev.co.kr/454</guid>
						<comments>https://aidev.co.kr/454#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/194/454/aeeeb64282b3c3c5c91c66d400a9e981.jpg" alt="recognize.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p>'쉽게 풀어쓴 인공지능 게임 프로그래밍'에 있는 프로그램을 하나 소개해 드리겠습니다.<br />
신경망을 사용하여 마우스의 제스쳐를 학습한 후 인식하는 프로그램입니다.<br /><br /><br /><br />
먼저 마우스의 움직임을 신경망의 입력으로 적절하게 표현을 해야하는데<br />
여기서는 12개의 벡터를 사용하여 구현을 하였습니다.<br />
마우스의 움직임을 각 점에서의 방향을 나타낼 수 있도록 단위벡터로 저장한 다음<br />
전체 점의 개수를 줄여서 모두 12개의 벡터로 나타냅니다.<br /><br />
그리고 출력은 전체 제스처의 개수만큼 존재합니다.<br />
그러므로 제스쳐의 수가 증가할 수록 출력의 개수도 따라서 증가합니다.<br /><br />
학습방법은 감독학습의 대표적 방법인 오류역전파 방식을 사용하였습니다.<br />
이러한 마우스의 입력이 들어왔을때 입력에 맞는 출력이 나오도록 학습이 됩니다.<br /><br /><br /><br />
오른쪽 버튼를 누른채로 마우스를 움직이면 제스쳐가 입력이 되는데<br />
학습된 제스쳐와 일치하는 제스쳐의 이름을 출력합니다.<br />
기본적으로 왼쪽, 오른쪽, 위, 아래, 사각형 등의 제스쳐가 입력이 되어있습니다.<br />
그리고 L 키를 누른후 새로운 제스쳐를 입력할 수 있습니다.<br /><br />
블랙앤화이트에서 보면 마우스의 움직임으로 마법을 수행할 수 있는데<br />
거기서도 이러한 신경망 기법이 사용되었을지도 모르겠네요.</p></div>]]></description>
						<pubDate>Fri, 25 Mar 2016 02:08:19 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[신경망을 이용한 사용자의 행동 학습]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/452</link>
			<guid isPermaLink="true">https://aidev.co.kr/452</guid>
						<comments>https://aidev.co.kr/452#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/194/452/32518d0a2e6aeaf662a14e8dd9990047.jpg" alt="nagent.jpg" style="" /></p>

<p> </p>

<p>소스코드 : 첨부파일</p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>사용자의 행동 학습</b></p>

<p align="justify"> </p>

<p align="justify">'블랙 앤 화이트'란 게임을 보면 사용자는 애완동물과 같은 크리쳐를 하나씩 가지고 있다. 이 크리쳐가 보통 다른 일반적인 게임 인공지능과 다른 점은 사용자의 행동이나 가르침을 학습하여 새로운 행동을 배워나간다는 데 있다. 크리쳐 앞에서 여러 가지 마법이나 작업들을 해보이면, 조금씩 그러한 행동들을 배워 적절한 상황에서 학습한 행동들을 수행하는 것을 볼 수 있다.</p>

<p align="justify"> </p>

<p align="justify">이처럼 사용자의 행동을 배우고 새로운 행동을 학습하는 것은 게임에서 뿐만아니라, 사용자의 성향을 학습을 통해 파악하여 더 나은 서비스를 제공할 수 있는 지능형 시스템(로봇에서 자동차, 일반 가전제품 등에 걸친)에서 중요하게 사용되는 요소이다.</p>

<p align="justify"> </p>

<p align="justify">학습을 위해 사용할 수 있는 방법에는 '블랙 앤 화이트'에서 사용한 디시전 트리(decision tree)를 비롯해서 여러 가지가 있지만, 여기서는 이전에 다루었던 신경망(neural network)을 이용하여 사용자의 행동을 학습하는 인공지능 에이전트를 구현해 보았다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>프로그램 소개</b></p>

<p align="justify"> </p>

<p align="justify">프로그램의 기본적인 목적은 사용자의 행동을 학습한 후 에이전트가 학습한 내용에 따라 적절하게 행동하는 지를 확인하는데 있다. 먼저 'Player' 버튼을 눌러 60초 동안 커서키(이동)와 스페이스(공격)를 사용하여 몬스터를 공격하고 음식을 통해 체력을 회복하며 여러 행동을 수행한다.</p>

<p align="justify"> </p>

<p align="justify">그 다음 'Training' 버튼을 누르면 신경망을 통한 학습이 수행되는데 에러율이 적을수록 학습이 더 잘 이루어진 것이다. 학습이 끝난 후 'Agent' 버튼을 누르면 학습한 내용에 따라 에이전트가 행동을 수행한다. 'Initialize' 버튼은 에이전트의 학습된 내용과 사용자의 입력을 새로 초기화 한다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>기타 규칙들</b></p>

<p align="justify"> </p>

<p>- 몬스터는 모두 10마리, 회복약은 모두 5개 존재<br />
- 몬스터나 회복약은 하나 없어질 때마다 임의의 장소에서 새로 생성됨<br />
- 가능한 행동에는 전후좌우 이동, 보고 있는 방향으로 공격의 5가지가 가능<br />
- 한 텀에는 하나의 행동만이 가능<br />
- 몬스터는 랜덤하게 움직이다 시야에 플레이어(또는 에이전트)가 있으면 추격하여 공격<br />
- 몬스터를 없애면 10점의 점수를 얻는다<br />
- 회복약을 먹으면 50만큼 체력이 회복<br />
- 몬스터에게 공격을 당하면 10만큼 체력이 감소<br />
- 체력이 0이 되면 종료<br />
- 60번의 텀이 지나면 종료</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>신경망의 구조</b></p>

<p align="justify"> </p>

<p align="justify">신경망의 입력은 현재 상태인 플레이어의 전후좌우 시야 2칸 내의 개체들 24개(자신의 위치 제외)와 플레이어의 방향 4개, 체력 1개 등 모두 29개로 구성된다. 그리고 신경망의 출력은 현재 상태에서 플레이어의 행동인 대기, 전후좌우 이동, 공격 등의 6가지로 구성된다.</p>

<p align="justify"> </p>

<p align="justify">신경망의 구조는 입력층인 29개의 노드와 각각 50개의 노드로 구성된 2개의 은닉층, 6개의 출력층으로 이루어져 있다. 학습 알고리즘으로는 오류 역전파(error back-propagation) 방식을 사용하였다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>신경망 학습의 특징</b></p>

<p align="justify"> </p>

<p align="justify">신경망 기반 학습의 특징은 먼저 동적인 행동 학습이 가능하다는데 있다. 미리 프로그램된 인공지능일 경우에는 정해진 방식으로만 동작할 수 있어 항상 같은 행동방식을 유지한다. 그리고 규칙들이 커질 경우 프로그래밍이 더욱 복잡해지는 단점이 있다. 하지만 학습을 통해 행동을 결정한다면 학습의 내용에 따라 서로 다른 행동을 수행할 수 있어 상황에 따라 적합한 행동방식을 배울 수 있다.</p>

<p align="justify"> </p>

<p align="justify">또 다른 특징으로 학습의 일반화(generalizaion)를 들 수 있다. 만약 위의 프로그램에서 신경망을 사용하지 않고 사용자의 입력에 따라 각 상태마다 일일이 각 출력을 설정한다면, 상태집합이 4의 29승 정도이므로 적어도 약 100,000,000,000,000,000개 이상의 상태에 대해 출력을 지정해야 한다. 그러나 신경망은 일정한 패턴을 인식하여 일반화시키는 특징이 있기 때문에 훨씬 적은 입력 데이터만으로도 새로운 입력에 대해서도 비슷한 패턴의 적절한 출력을 얻을 수 있다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>결과 분석</b></p>

<p align="justify"> </p>

<p align="justify">플레이어가 몬스터를 피해다니기만 하며 되도록 공격을 하지 않는 방식으로 학습을 수행하였을 경우, 100~200개의 입력정도만 학습시키면 매우 효과적으로 사용자와 같은 행동을 보임을 알 수 있다. 그러나 공격위주의 방식으로 학습을 하였을 경우 학습의 에러율이 높아지고 올바른 행동을 보이지 않는다.</p>

<p align="justify"> </p>

<p align="justify">이는 전자의 경우 몬스터를 회피하는 방식은 상태와 출력 사이에 일정한 패턴이 있어 학습이 용이한 반면, 후자의 경우에는 공격하는 상태와 회피하는 상태가 중복되어 학습이 쉽게 이루어지지 않게 된다. 예를 들어 몬스터가 바로 왼쪽에 있을 때 공격을 할 수도 있고 도망갈 수도 있는데, 몬스터가 왼쪽에 있다는 같은 상태 입력에 두 개의 행동 출력이 있기 때문에 어느 한쪽으로 행동을 결정되지가 않아 신경망의 일반화가 잘 이루지지 않는다.</p>

<p align="justify"> </p>

<p align="justify">이를 해결하기 위해 플레이어의 방향 4개와 체력 1개의 입력을 추가했지만 나머지 24개의 주변상황 입력의 영향이 커서 그런지 별 효과가 없었다. 이러한 문제에 대한 적절한 방안이 필요할 것이다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify">[참고자료]</p>

<p align="justify">    - 학습하는 기계신경망, 이상원, Ohm사</p></div>]]></description>
						<pubDate>Fri, 25 Mar 2016 02:07:02 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[신경망을 통한 학습의 구현]]></title>
			<dc:creator><![CDATA[깊은바다]]></dc:creator>
			<link>https://aidev.co.kr/448</link>
			<guid isPermaLink="true">https://aidev.co.kr/448</guid>
						<comments>https://aidev.co.kr/448#comment</comments>
									<description><![CDATA[<div class="xe_content"><p><img src="http://aidev.co.kr/files/attach/images/194/448/2604257b38d4e8301088b43bdc5029c0.jpg" alt="npingpong.jpg" style="" /></p>

<p> </p>

<p>소스코드 : 첨부파일</p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>신경망의 개요</b></p>

<p align="justify"> </p>

<p align="justify">기존의 기호 처리 기반의 기존 인공지능 분야와는 달리, 신경망의 실제 인간의 뇌의 작용을 모델링하여 구현한 정보처리 모델이다. 기존 디지털 컴퓨터는 결정론적인 이진 계산 모델에 기반하여 순차적으로 정보를 처리하는 방식이지만, 신경망은 생물학적인 방식의 모델로서 문제를 잘게 나누고 그것들의 결과를 더하므로서 문제를 해결하는 병렬적이고 아날로그적인 처리 방식이다.</p>

<p align="justify"> </p>

<p align="justify">신경망 모델은 1946년 워렌 맥클로츠(Warren McCulloch)와 월터 피츠(Walter Pitts)의 논문에서 처음 제안되었으며 기존의 기호처리 인공지능 모델과 같은 시기에 연구가 시작되었다. 초기에 신경망은 인공지능 연구자들로부터 많은 주목을 받았지만 신경망의 한 모델인 '퍼셉트론'의 한계가 지적되면서 인공지능 연구의 주도권이 기호처리 방식으로 넘어가게 되었다. 하지만 그로부터 몇십년후에 '퍼셉트론'의 한계를 극복한 '다층 퍼셉트론'이 발표됨으로써 신경망은 기존의 기호처리 방식과 견줄 만한, 또는 그 한계를 극복할 수 있는 새로운 대안으로 각광을 받고 있다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>생물학적 신경세포의 구조</b></p>

<p align="justify"> </p>

<p align="justify">먼저 인간 두뇌의 기본 단위인 신경세포의 구조는 아래와 같다. 인간의 두뇌는 평균 천만개, 즉 10의 11승 개의 신경세포들로 이루어져 있으며, 각 신경세포는 수상돌기들을 통해서 대략 10000개 까지의 다른 신경세포들과 연결되어 있다. 신호는 전기화학적인 과정들을 통해서 전달되는데, 수상돌기와 축색돌기의 연결부인 시냅스가 기본적인 신호전달 지점이다.</p>

<p align="justify"> </p>

<p align="justify">수상돌기들은 다른 신경세포들로터 온 신호들을 모으고 세포체가 그 신호들을 요약하여 그 결과를 축색돌기를 통해 다른 신경세포로 전달한다. 중요한 점은 그 결과가 시냅스를 통해 넘어갈 수 있는지에 대한 여부인데 이것이 인간의 두뇌가 학습을 하는 원리라 할 수 있다.</p>

<p align="justify"> </p>

<p align="justify">즉, 수백수천만개의 신경세포들이 서로 연결되어 있고 신경세포들간의 연결상태(시냅스를 통해 다른 신경세포에 정보를 전달하는지의 여부) 자체가 학습되어진 지식이라 할 수 있다. 이러한 연결상태들은 학습에 따라 변할 수 있고, 그러므로 여러 가지 정보들을 계속적으로 습득할 수 있다.</p>

<p align="justify"> </p>

<p align="justify">실제 신경망 모델을 적용하기 위해서는 현재의 이진 순차처리 방식의 컴퓨터와는 다른 구조의 병렬 신경망 컴퓨터가 필요하다. 하지만 신경망 컴퓨터는 아직 개발되지 않았으며 현재는 기존의 컴퓨터에서 병렬구조의 신경망을 소프트웨어적으로 순차적 구조의 시뮬레이션으로 구현하고 있다. 그렇기 때문에 병렬처리 기반의 빠른 속도가 불가능하여 처리속도가 현저히 저하되고 있다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/448/668d45a0ca1fbb1c9c3f08dc6b312bfa.jpg" alt="figure1.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>신경망 모델의 구조</b></p>

<p align="justify"> </p>

<p align="justify">간단한 하나의 신경망의 구조는 아래 그림과 같다. n개의 X 입력들이 각각 W라는 가중치에 의해 Y라는 뉴로드(인공 신경세포)에 연결되어 있다. 각 입력들은 각각의 가중치들과 곱해져 더해지고, 이 결과가 특정한 조건보다 크다면 출력을 통해 전달된다.</p>

<p align="justify"> </p>

<p align="justify">여기서 가장 중요한 점은 가중치 W들을 어떻게 설정하는가 이다. 특정한 입력이 들어왔을 때 특정한 출력이 나오도록 하기 위해, 그 조건에 맞도록 적절하게 가중치들을 조정하여야 한다. 이처럼 특정 상황에 맞도록 가중치를 설정하는 것이 바로 정보의 저장, 또는 학습이라 할 수 있다.</p>

<p align="justify"> </p>

<p align="justify">보통 여러개의 입력들을 반복적으로 신경망에 넣음으로써 점차적으로 가중치들을 원하는 방향으로 조절하게 된다. 문제는 어떻게 가중치들을 설정할 것인가인데, 이와 같은 학습의 방법에 따라 다양한 신경망 모델이 개발되었다.</p>

<p> </p>

<p><img src="http://aidev.co.kr/files/attach/images/194/448/dad80651fccbc324ae17b67c4fcb39a3.jpg" alt="figure2.jpg" style="" /></p>

<p> </p>

<p> </p>

<p> </p>

<p align="justify"><b>신경망의 장.단점</b></p>

<p align="justify"> </p>

<p align="justify">신경망의 기존의 기호처리 방식과 비교하여 다음과 같은 장점이 있다.</p>

<p align="justify"> </p>

<p align="justify">첫째, 신경망은 사람의 뇌에 더욱 근접한 구조를 가지고 있다. 일반적으로 비슷한 구조에서 비슷한 기능이 생겨나리라고 기대할 수 있다. 그러므로 신경망의 특징인 학습능력, 대규모 병렬동작, 지식의 분산표현등은 지금까지 인공지능의 구현에 있어 문제가 되었던 모호함의 처리, 탐색공간의 거대화 등을 해결할 수 있는 가능성을 제시하고 있다.</p>

<p align="justify"> </p>

<p align="justify">둘째, 신경망은 학습을 위한 적당한 구조를 가지고 있다. 기존의 방식으로도 학습하는 시스템을 만들 수 있지만, 이를 위해 많은 노력이 소요된다. 그러나 신경망의 경우, 사람은 단지 신경망으로 하여금 가르치기를 원하는 것들을 경험하도록 하기만 하면 되므로 학습이 훨씬 용이하다.</p>

<p align="justify"> </p>

<p align="justify">셋째, 신경망은 매우 단순하다. 신경망을 구성하는 신경세포들의 구조와 기능은 매우 단순하여 복잡한 프로그래밍 과정이 필요가 없다. 그러나 이처럼 단순한 구조로부터 여러 가지 복잡한 작업이 가능하다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify">하지만 신경망은 기존의 방식에 비해 다음과 같은 단점들이 존재한다.</p>

<p align="justify"> </p>

<p align="justify">첫째, 신경망의 내적 지식을 사람이 이해하기 힘들다는 점이다. 기존의 방식은 사람에 의해 프로그래밍되어 되어지므로 이를 분석하면 어떻게 동작할 것인지를 알 수 있지만, 신경망은 학습 후 회상을 통해서만 결과를 알 수가 있다.</p>

<p align="justify"> </p>

<p align="justify">둘째, 아직까지 신경망의 하드웨어적인 구현이 어렵다는 점이다. 신경망의 지식은 그것의 연결 가중치의 전체적인 상태에 의해 결정된다. 따라서 보다 많은 지식을 가지기 위해서는 보다 많은 연결이 필요하게 된다. 그러나 아직까지의 반도체 기술로는 충분히 많은 연결을 구현하기가 어렵다.</p>

<p align="justify"> </p>

<p align="justify">셋째, 신경망은 사람이 잘하는 여러 가지 작업에 있어 컴퓨터보다 뛰어난 성능을 발휘하지만, 사람의 뇌가 컴퓨터에 비해 잘하지 못하는 산술 연산과 같은 부분에 있어서는 컴퓨터에 미치지 못한다.실제로 산술적인 연산 기능을 수행하는 신경망을 구성하기는 매우 힘들다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"><b>간단한 응용 - Neural Pingpong</b></p>

<p align="justify"> </p>

<p align="justify">가장 단순하며 최초의 신경망 학습방법인 '헵의 규칙'(Hebbian Learning Rule)을 사용하여 간단한 학습을 수행하는 게임을 구현하였다. 1949년 도널드 헵(Donald O. Hebb)에 의해 만들어진 이 방법은 다음과 같은 규칙으로 신경망의 연결가중치를 조절한다.</p>

<p align="justify"> </p>

<p align="justify">'만일, 어떤 신경세포의 활성이 다른 신경세포가 활성하는데 계속적으로 공헌을 한다면, 두 신경세포간의 연결가중치를 증가시켜 주어야 한다'즉, 어떤 순간에 서로 연결된 두 개의 신경세포가 동시에 활성이 되었다면 그것들 사이의 연결가중치를 증가시켜 주어야 한다는 것이다. 이것은 마치 인간 관계에 있어, 두 사람의 의견이 계속적으로 일치하면, 그들의 친밀도가 커지는 것과 비슷한 것이다.</p>

<p align="justify"> </p>

<p align="justify">신경망의 입력과 출력은 각각 3개씩이다. 각 입력은 공이 라켓위에 있을 때, 라켓과 같은 위치일 때, 라켓 아래에 있을 때이다. 그에 따른 출력은 라켓을 위로 이동, 라켓 정지, 라켓을 아래로 이동으로 나누어져 있다. 예를들어 입력패턴이 '0 0 1'이면 출력패턴도 '0 0 1'로, 공이 라켓 아래에 있으면 라켓을 아래로 이동하는 식이다.</p>

<p align="justify"> </p>

<p align="justify">이와같이 입출력의 학습 패턴을 정하고 매 순간마다 공과 라켓의 위치를 조사하여 패턴을 결정하고 학습을 시키게 된다. 그리고 학습 후 현재 입력에 맞는 출력을 신경망에서 얻은후 이에 따라 라켓을 이동한다. 처음에는 컴퓨터의 라켓이 제자리에 가만히 있다가 점차 학습이 진행될수록 라켓이 공의 위치에 따라 이동하게 된다.</p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify"> </p>

<p align="justify">[참고자료]</p>

<p align="justify">    - 학습하는 기계신경망, 이상원, Ohm사<br />
    - Game Programming Gems, Andre LaMothe, 정보문화사, p.429 ~ p.455</p></div>]]></description>
						<pubDate>Fri, 25 Mar 2016 02:05:28 +0900</pubDate>
								</item>
			</channel>
</rss>
