Get it on Google Play


Wm뮤 :: 'AI' 카테고리의 글 목록

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2025. 6. 7. 18:17 AI

 

 

 

게임이나 일반응용프램과 달리 AI쪽에서는 그래픽카드 처리속도보다 VRAM 크기가 중요하다

게임처럼 실시간 처리가 필요한게 아니니 처리속도야 시간을 들이면 해결될이지만

VRAM이 부족하면 로드 자체가 실패하기 때문

상용프로그램으로 개발할땐 엄청나게 커다란 문제이다

프로그램을 다운로드 받았는데 작동이 안 된다고 하면 곤란하지 않은가

 

 

 

그런데 일반 윈폼프로젝트에는 VRAM측정이 존재하지 않는다. Direct3D기반 프로젝트에서만 분석해주기 때문 

https://learn.microsoft.com/ko-kr/visualstudio/profiling/gpu-usage?view=vs-2022

 

 

그래서 이번엔 Nuget을 이용한 VRAM 측정방법을 소개하겠다

 

 

LibreHardwareMonitorLib를 쓸것이다

상업적 사용도 가능하단다

 

 

 

설치끝

 

 

 

아래코드를 넣어준다

https://gist.github.com/ahzkwid/a003bf0e6c9f3794d47b1296b3644a9d



using LibreHardwareMonitor.Hardware;
using System;
using System.Diagnostics;

namespace Ahzkwid
{
    internal class MemoryChecker
    {
        static Computer computer = null;
        public static Computer GetComputer()
        {
            if (computer == null)
            {
                computer = new Computer
                {
                    IsGpuEnabled = true
                };
                computer.Open();
            }
            return computer;
        }
         static List<IHardware> GPUHardwares()
        {
            computer = GetComputer();
            var hardwares= computer.Hardware.ToList().FindAll(hardware =>
            {
                if (hardware.HardwareType == HardwareType.GpuNvidia || hardware.HardwareType == HardwareType.GpuAmd || hardware.HardwareType == HardwareType.GpuIntel)
                {
                    return true;
                }
                return false;
            });
            return hardwares;
        }

        public static float RamUsed
        {
            get
            {
                float usad = 0;
                var process = Process.GetCurrentProcess();
                usad = process.PrivateMemorySize64 / (1024 * 1024);
                return usad;
            }

        }
        public static float VramFree
        {
            get
            {
                return VramTotal-VramUsed;
            }
        }
        public static float VramUsed
        {
            get
            {
                float usad = 0;
                foreach (var hardware in GPUHardwares())
                {
                    hardware.Update();

                    foreach (var sensor in hardware.Sensors)
                    {
                        var lowerName = sensor.Name.ToLower();
                        if (lowerName.Contains("memory") && lowerName.Contains("used") && lowerName.Contains("gpu"))
                        {
                            usad = (float)sensor.Value;
                            break;
                        }
                    }
                }
                return usad;
            }

            //computer.Close();
        }
        public static float VramTotal
        {
            get
            {
                float total = 0;
                foreach (var hardware in GPUHardwares())
                {
                    hardware.Update();

                    foreach (var sensor in hardware.Sensors)
                    {
                        var lowerName = sensor.Name.ToLower();
                        if (lowerName.Contains("memory") && lowerName.Contains("total") && lowerName.Contains("gpu"))
                        {
                            total = (float)sensor.Value;
                            break;
                        }
                    }
                }
                return total;
            }

            //computer.Close();
        }
    }
}

 

 

 

 

 

 

그리고 테스트할 코드 앞뒤로 아래와같이 변화량을 추적한다

왜냐하면 VRAM의 전체사용량만을 추적할뿐 프로세스가 얼만큼 차지하는지는 나오지 않기 떄문이다

 

 

Debug.WriteLine($"Private Memory: {MemoryChecker.RamUsed} MB");
var vramUsad = MemoryChecker.VramUsed;
var vramUsadPre = vramUsad;
Debug.WriteLine($"vramUsad:{vramUsad - vramUsadPre} MB");

 

 

 

 

일반메모리가 5GB, VRAM을 4GB먹는다는것을 알게되었다

 

이것은 에디터에서만 테스트하는 용도뿐만이 아니고

일반사용자들의 VRAM을 측정하여 어떤 모델을 올릴지 취사선택하는것도 가능하다

 

GpuLayerCount를 최소 256으로 올려야 GPU에서 처리를 하는데 메모리가 너무 부족하여

32레이어밖에 못 올리니 GPU가 작동 안 하는 문제가 발생한다

옵션 좀 잘 조정해봐야겠다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'AI' 카테고리의 다른 글

AI 이미지 인식방법  (0) 2025.05.31
LLaVaSharp 오류 모음  (0) 2025.05.29
AI 번역기 만들기 TinyLLaMa vs Phi-2  (0) 2025.05.26
posted by 모카쨩
2025. 5. 31. 08:34 AI

https://www.youtube.com/watch?v=ZaeT7N8XH3A

 

 

라마샵 LLaMaSharp 사용법은 아래 링크

https://wmmu.tistory.com/entry/%EB%9D%BC%EB%A7%88%EC%83%B5-LLaMaSharp-%EC%82%AC%EC%9A%A9%EB%B2%95

 

라마샵 LLaMaSharp 사용법

https://youtu.be/5WpHA-wr_l4 이름에도 보다시피 LLM, 즉 AI를 C#에서 사용하기 위한 라이브러리다 파이썬이 일반사용자용 프로그램만들때 거지같은 점이 있기 때문에(내가 파이썬을 쓰레기 언어라고 하

wmmu.tistory.com

 

 

 

2024년 3월 31일 AI 응용프로그램에 커다란 발전이 이루어진다

LLaMaSharp에서 LLaVa라는 이미지처리와 텍스트처리를 하는 모델을 지원하기 시작한것

ChatGPT에서 2023년 9월에 이미지 처리를 지원했으니 당대 최신기술이 일반사용자 레벨로 내려온것이다

이것을 전문용어로는 멀티모달이라고 한다

나온지 얼마 안되어서 그런지 너무 무거워서 느리다

 

 

https://huggingface.co/cjpais/llava-1.6-mistral-7b-gguf

 

cjpais/llava-1.6-mistral-7b-gguf · Hugging Face

GGUF Quantized LLaVA 1.6 Mistral 7B Updated quants and projector from PR #5267 Provided files ORIGINAL LLaVA Model Card Model details Model type: LLaVA is an open-source chatbot trained by fine-tuning LLM on multimodal instruction-following data. It is an

huggingface.co

위 링크에서 두개를 다운받는다

주의할점은 모델을 두개나 올리기때문에 VRAM이 정말정말 부족하다는것이다

다행스럽게도 위 gguf는 초경량모델이라 그나마 문제가 덜하다

 

 

 

https://scisharp.github.io/LLamaSharp/0.12.0/Examples/LLavaInteractiveModeExecute/

https://scisharp.github.io/LLamaSharp/0.11.2/xmldocs/llama.common.modelparams/

 

 

위 공식문서들을 참고하여 아래 코드를 만들었다

공식문서에서는 KvCacheRemove를 이용해 캐시를 리셋하여 사용하지만

완전히 지워지지 않거나 메모리 공간은 여전히 차지하는지

온갖 문제가 발생하여 나는 executor를 재생성하는 방식으로 했다

 

 

 

https://gist.github.com/ahzkwid/6320132dc70b70b9d706059ca3128268

 

텍스트와 이미지처리

텍스트와 이미지처리. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

using LLama;
using LLama.Common;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Imaging;

namespace Ahzkwid
{
    public class LlavaMultimodalAgent
    {
        private readonly ModelParams parameters;
        private readonly LLamaWeights modelWeights;
        private readonly LLavaWeights clipProjection;

        //private readonly InteractiveExecutor _executor;
        public LlavaMultimodalAgent(
        string modelPath = "Models/llava-v1.6-mistral-7b.Q4_K_M.gguf",
        string clipModelPath = "Models/mmproj-model-f16.gguf")
        {
            Debug.WriteLine("Initializing LlavaMultimodalAgent");
            parameters = new ModelParams(modelPath)
            {
                ContextSize = 1024,
                GpuLayerCount = 32,
                //Threads = Environment.ProcessorCount * 4,
                //BatchThreads = Environment.ProcessorCount * 4,
                BatchSize = 256,
                //UBatchSize = 256,
            };
            modelWeights = LLamaWeights.LoadFromFile(parameters); 
            clipProjection = LLavaWeights.LoadFromFile(clipModelPath);


            Debug.WriteLine("Model initialization complete.");
            Debug.WriteLine("");
            Debug.Write("USER:");
        }

        public async Task<string> DescribeImageAsync(Bitmap bitmap, string question)
        {
            var context = modelWeights.CreateContext(parameters);
            var _executor = new InteractiveExecutor(context, clipProjection);


            var imageBytes = new byte[] { };


            if (bitmap != null)
            {
                imageBytes = BitmapToBytes(bitmap);
            }

            //_executor.Images.Clear();
            //_executor.Context.NativeHandle.KvCacheRemove(LLamaSeqId.Zero, -1, -1);
            _executor.Images.Add(imageBytes);

            //string prompt = "<image>\n<|USER|>\n" + question + "\n<|ASSISTANT|>\n";
            string prompt = $"<image>\n\nUSER:\n{question.Trim()}\nASSISTANT:\n";
            Debug.WriteLine(question);


            var antiPrompt = "USER:";
            var inferParams = new InferenceParams
            {
                MaxTokens = 256,
                AntiPrompts = new List<string> { antiPrompt },
            };

            var result = new System.Text.StringBuilder();
            await foreach (var token in _executor.InferAsync(prompt, inferParams))
            {
                result.Append(token);
                Debug.Write(token);
            }

            return result.ToString().Replace(antiPrompt, "").Trim();
        }

        private byte[] BitmapToBytes(Bitmap bitmap)
        {
            using (var ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Png); 
                return ms.ToArray();
            }
        }
    }
}

 

 

 

 

 

개발된곳이 외국이다보니 한국어에 쥐약이므로 가급적 영어를 써주자

한국어가 아예 안 되는건 아니니 귀찮다면 한국어로 해도 된다

 

 

 

https://www.youtube.com/watch?v=ZaeT7N8XH3A

 

 

제대로 된다

 

 

 

 

 

 

 

 

'AI' 카테고리의 다른 글

C# VRAM 모니터링 방법  (0) 2025.06.07
LLaVaSharp 오류 모음  (0) 2025.05.29
AI 번역기 만들기 TinyLLaMa vs Phi-2  (0) 2025.05.26
posted by 모카쨩
2025. 5. 29. 12:23 AI

 

 

 

 

System.AccessViolationException: 'Attempted to read or write protected memory. 
This is often an indication that other memory is corrupt.'

 

보다시피 메모리 초과다.

 

var clipModel = LLavaWeights.LoadFromFile(clipModelPath);

이 코드에서 발생했다

 

var parameters = new ModelParams(modelPath);

이 코드를

 

var parameters = new ModelParams(modelPath)
{
    ContextSize = 1024,
    GpuLayerCount = 32,
    BatchSize = 256,
};

이렇게 수정해서 명시적으로 ContextSize와 GpuLayerCount를 지정해주면 된다

난 2046이랑 4096에서 발생했으니 더 낮춰야 안정적일지도

ContextSize나 GpuLayerCount 둘 중 하나라도 너무 높으면 발생하는데

ContextSize는 그렇다 쳐도 GpuLayerCount는 높을수록 빠르기 때문에 고민된다

이거 말고도 BatchSize도 영향을 주는데 1024로 해도 오류 생기고 64로 해도 이미지를 못 읽고 128에서는 안경벗은사람마냥 보긴보는데 제대로 못 본다. 256이 적절했음

UBatchSize는 거의 영향이 없었다

이걸로도 효과를 못 본다면 그냥 더 낮은 양자화 모델로 바꾸자

'AI' 카테고리의 다른 글

AI 이미지 인식방법  (0) 2025.05.31
AI 번역기 만들기 TinyLLaMa vs Phi-2  (0) 2025.05.26
라마샵 LLaMaSharp 사용법  (0) 2025.05.24
posted by 모카쨩
2025. 5. 26. 09:16 AI

 

 

https://www.youtube.com/watch?v=MyTmlXaMCvk

 

 

라마샵 LLaMaSharp 사용법은 아래 링크

https://wmmu.tistory.com/entry/%EB%9D%BC%EB%A7%88%EC%83%B5-LLaMaSharp-%EC%82%AC%EC%9A%A9%EB%B2%95

 

라마샵 LLaMaSharp 사용법

https://youtu.be/5WpHA-wr_l4 이름에도 보다시피 LLM, 즉 AI를 C#에서 사용하기 위한 SDK이다 파이썬이 일반사용자용 프로그램만들때 거지같은 점이 있기 때문에(내가 파이썬을 쓰레기 언어라고 하는 이유

wmmu.tistory.com

 

 

저번에 라마샵 사용법을 정리했었다

그런데 아시다시피 요새 GPT가 꽉 붙들고 있어서 챗봇은 만드는 의미가 없다

다행스럽게도 챗봇은 사용법중 하나일뿐 프롬프트에 따라 다양한 결과물을 만들수 있다

 

 

 

저번에 TinyLLaMa를 사용했으니 이번엔 Phi-2를 받아보자
Phi-2는 아래 링크에서 받을수 있다

https://huggingface.co/TheBloke/phi-2-GGUF

 

TheBloke/phi-2-GGUF · Hugging Face

Phi 2 - GGUF Description This repo contains GGUF format model files for Microsoft's Phi 2. About GGUF GGUF is a new format introduced by the llama.cpp team on August 21st 2023. It is a replacement for GGML, which is no longer supported by llama.cpp. Here i

huggingface.co

저번과 똑같이 Models 폴더에 넣어주면 된다

이번엔 둘다 돌려서 성능테스트도 해볼것이다

 

 

나는 번역기능이 필요해서 번역기로 만들었다

 

저번에 사용한 챗봇 코드는 사용할수 없다

프롬프트 클래스 자체가 챗봇용으로 만들어졌기 때문

 

내가 사용한 코드는 아래에 올려두었다

https://gist.github.com/ahzkwid/fe5a98c9db034cbec4d2c0aa710c9b95

 

LLaMaSharpSample2

LLaMaSharpSample2. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

using LLama;
using LLama.Common;
using LLama.Sampling;
using System.Diagnostics;

namespace LLaMaSharpSample2
{
    internal static class Translator
    {
        private static StatelessExecutor _executor;
        enum Model
        {
            TinyLLaMa, Phi2
        }
        static Model model= Model.TinyLLaMa;
        static Translator()
        {
            var modelPath = "Models/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf";
            if (model==Model.Phi2)
            {
                modelPath = "Models/phi-2.Q4_K_M.gguf";
            }
            var modelParams = new ModelParams(modelPath)
            {
                ContextSize = 2048
            };
            var weights = LLamaWeights.LoadFromFile(modelParams);
            _executor = new StatelessExecutor(weights, modelParams);


            Debug.WriteLine($"model: {model}");
            Debug.WriteLine("");
        }
        public static string TranslateSync(string input)
        {
            return Task.Run(() => Translate(input)).Result;
        }
        public static async Task<string> Translate(string input)
        {
            Debug.WriteLine($"input: {input}");

            var language = "English";
            //language = "Korean";
            string prompt = $"Translate the following text into {language}\nText: {input}\n{language}: ";
            if (model == Model.Phi2)
            {
                prompt = $"<|system|>Translate from Text to {language}\n<|Text|>{input}\n<|Translate|>";
            }

            var inferParams = new InferenceParams
            {
                //MaxTokens = 128,
                MaxTokens = input.Length*2,
                AntiPrompts = new List<string> { "\n"},
            };

            StringBuilder result = new StringBuilder();
            Debug.Write("output: ");
            await foreach (var token in _executor.InferAsync(prompt, inferParams))
            {
                Debug.Write(token);
                result.Append(token);
            }

            Debug.WriteLine("");
            return result.ToString().Trim();
        }

    }
}

 

이번엔 StatelessExecutor를 사용했다

저번엔 InteractiveExecutor를 사용하여 대화내용을 기억하게 했지만 

StatelessExecutor는 매번 초기상태를 유지하여 번역기에 적합하다

 

 

프롬프트도 InferAsync에 string프롬프트를 사용하면 프롬프트를 세밀하게 조정할수 있다

주의점은 모델마다 프롬프트를 미묘하게 다르게 조정해야 한다

 

잘 보면 Phi2는 <|text|>를 사용하고 있고 tinyllama는 Text:를 사용하고 있다

재밌는점은 <|text|>는 원래 tinyllama에 권장되는 프롬프트이지만 저렇게 쳐야 더 좋은 결과물이 나왔다

반대로 tinyllama의 프롬프트를 phi2에 넣어도 원하는 결과물이 나오지 않는다

 

 

결과물

https://www.youtube.com/watch?v=MyTmlXaMCvk

 

Phi-2가 더 무겁지만 TinyLLaMa가 더 좋은 결과물을 만들어 주었다


오해하면 안되는게 두녀석은 원래 번역용으로 개발된것이 아니므로

이것만으로 모델자체의 좋고 나쁘다를 결정할수는 없다는것이다

 

그저 번역용으로 한정지었을때만 TinyLLaMa를 써야한다는것만 알뿐

 

'AI' 카테고리의 다른 글

LLaVaSharp 오류 모음  (0) 2025.05.29
라마샵 LLaMaSharp 사용법  (0) 2025.05.24
인공신경망 작동 원리  (0) 2025.02.18
posted by 모카쨩
2025. 5. 24. 09:23 AI

 

 

 

 

 

https://youtu.be/5WpHA-wr_l4

 

 

 

이름에도 보다시피 LLM, 즉 AI를 C#에서 사용하기 위한 라이브러리다 

 

파이썬이 일반사용자용 프로그램만들때 거지같은 점이 있기 때문에

(내가 파이썬을 쓰레기 언어라고 하는 이유중 하나다)

윈폼과 융합하려는 시도가 있었고

그 결과물이 LLaMaSharp이다

 

NuGet은 두개 받아야 한다

CUDA 많이 쓰는데 CUDA 안 깔은 이유는 호환성을 위해서다.

CUDA는 엔비디아 전용이라 암드유저와 이용환경 차이가 발생하니까

그냥 혼자쓸거면 CUDA용으로 깔아도 된다.

 

CUDA없이 CUDA용으로 깔아도 작동 자체는 되지만 난 비추천한다

차세대 OpenGL인 Vulkan이 있는데 뭐하러 개구진 Cuda를 쓴단말인가

위에서도 일반사용자 때문에 파이썬 구리다했는데 Cuda써서 또 사용자 쳐낼거면 이거쓰는 의미가 없다

 

 

이제 모델을 준비해야 할 차례인데 보통은 Hugging Face에서 다운받는다

https://huggingface.co/

 

Hugging Face – The AI community building the future.

The Home of Machine Learning Create, discover and collaborate on ML better. We provide paid Compute and Enterprise solutions. We are building the foundation of ML tooling with the community.

huggingface.co

(기분나쁘게 생겨서 한번만 봐도 뇌리에 남는다. 아 그거!)

 

GGUF와 GGML이 있는데 GGUF를 권장한다

 

왜냐면 GGUF가 더 최신 포맷이기 때문에

 

 

나는 TinyLlama모델을 썼다

왜냐고? 가벼우니까

근데 쓰다보니 phi2모델보다 좋은듯한 느낌이 들음

 

먼저 Hugging Face상단에 TinyLlama라고 검색한다

 

 

 

그러면 이렇게 주르륵 뜰건데 GGUF를 받아야 한다

 

 

 

 

 

https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/tree/main

 

TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF at main

 

huggingface.co

 

 

이거

참고로 gguf는 여러가지 버전이 있는데 Q가 낮을수록 경량모델이다.

Q는 비트수를 줄임으로서 경량화 한것이며 Q2는 2비트 Q3는 3비트이다

그런데 Q2나 Q4나 동일하게 Int4연산에 들어가서 그런진 몰라도 처리속도가 비슷하게 나온다

찾아보니 Q2랑 Q4 차이는 처리속도보다는 메모리사용량에 따라 선택하라고 한다. 어쩐지

이 윗단계로는 f16이 있다

그리고 모든 gguf 네이밍규칙에는 뒤에 무인/S/M/L이 있는데

스케일 조정에 따른 압축률에 따라 분류하는것이라고 하는데

어차피 윗단계 비트보다 작게 조정되므로 그냥 소숫점이라고 생각하면 된다. 무인=0, S=0.25,M=0.5,L=0.75

그러니까 Q2_K_S는 대충 2.25정도의 성능 Q4_K_M은 4.5정도의 성능

그래서 왠만하면 Q4_M을 쓰는게 좋은듯

심지어 해당 모델의 설명을 읽어보면 이중 Q4_K_M 모델이 제일 쓸만하다고 한다

그리고 0이 붙은건 안 쓰는게 좋다. 구형형식이라서

 

 

 

다 받았으면 빌드후 나오는 exe 있는곳에 Models폴더 만들고

 

Models 폴더에 이렇게 넣어준다

 

 

 

 

 

 

 

 

 

코드는 이 세곳을 참고해서 짜야한다

https://github.com/SciSharp/LLamaSharp

https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0

https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF

 

 

 

 

 

근데 프롬프트를 잘 짜야 한다 안 그러면 아래처럼 된다

 

(뇌절킹)

 

ㅡㅡ 프롬프트 짜는거 ㅈㄴ 어렵다

 

기능상 자동완성과 큰 차이가 없기 때문에 역할을 제대로 주지 않으면 나불거리기만 한다

사람또한 '자기 자신은 무엇이다' 라는 기억을 통해서 주체와 행동을 확립하지 않는가? 비슷하다고 보면 된다.

 

다행스럽게도 프롬프트를 쉽게 짤수 있게 ChatSession이라는 클래스가 있다

 

 

 

 

내가 사용한 코드는 아래에 올려두었다

https://gist.github.com/ahzkwid/e8f0454f4501921f56519d2ec516ddb7

 

LLaMaSharpSample

LLaMaSharpSample. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

using LLama;
using LLama.Common;
using LLama.Sampling;
using System.Diagnostics;

namespace LLaMaSharpSample
{
    internal static class LLM
    {
        private static ChatSession _chatSession;

        static LLM()
        {
            var modelPath = "Models/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf";
            var modelParams = new ModelParams(modelPath)
            {
                ContextSize = 2048
            };

            var weights = LLamaWeights.LoadFromFile(modelParams);
            var context = new LLamaContext(weights, modelParams);
            var executor = new InteractiveExecutor(context);

            var chatHistory = new ChatHistory();
            chatHistory.AddMessage(AuthorRole.System,
                "You are a concise and helpful assistant. Respond in a single short sentence.");

            _chatSession = new ChatSession(executor, chatHistory);

            Debug.WriteLine("NLP()");
            Debug.Write("User:");
        }



        public static async void Chat(string userInput)
        {
            Debug.WriteLine($"{userInput}");

            var inferParams = new InferenceParams
            {
                MaxTokens = 256,
                AntiPrompts = new List<string> { "User:" }, 
                SamplingPipeline = new DefaultSamplingPipeline()
            };

            Debug.Write("\n");

            await foreach (var token in _chatSession.ChatAsync(
                new ChatHistory.Message(AuthorRole.User, userInput),
                inferParams))
            {
                Debug.Write(token);
            }

        }
    }
}

 

 


https://youtu.be/5WpHA-wr_l4

 

이제 좋같은 파이썬 안 써도 된다

 

야호

 

 

UI나 클래스는 알아서 붙이자

 

 

 

 

 

 

 

 

 

 

'AI' 카테고리의 다른 글

AI 번역기 만들기 TinyLLaMa vs Phi-2  (0) 2025.05.26
인공신경망 작동 원리  (0) 2025.02.18
AI 환각현상과 분리뇌 현상의 유사성  (0) 2025.02.04
posted by 모카쨩
2025. 2. 18. 08:38 AI

 

 

 

유전알고리즘으로 만들어진 AI의 작동방식은 누구나 알것이다

 

1. 랜덤하게 생성된 규칙을 가진 개체를 수천개 만들어서

2. 제일 높은 점수를 가진 개체만 남기고 

3. 그 개체들의 복사본을 만들어서 변이를 준다

4. 1번으로 돌아간다

 

이 방식은 어떠한 환경에도 적응할수 있다는 매우 훌륭한 장점이 있지만

 

 

 

 

 

https://www.science.org/doi/10.1126/sciadv.1500921

 

https://medium.com/analytics-vidhya/journey-of-gradient-descent-from-local-to-global-c851eba3d367

 

 

생물이 가진 최대 단점인 적응도의 골(fitness valley) 또는 지역 최소점(local minima) 현상으로 대표되는 학습지연에 빠져버리기 쉽다는것이다.

이것에 대한 자세한 내용은 

https://youtu.be/fnrpQuSgy-Q?si=DNX8KzHbTHHZukKj&t=245

 

 

이 영상이 잘 설명하고 있으니 참고하자

 


그리고 근본적으로 생물의 알고리즘이지 사람의 알고리즘이 아니라는점도 있다

 

 

아무튼 유전알고리즘이 만들어내지 못한 인간지능을 구현하기 위해

그냥 처음부터 신경의 작동원리를 모방하여 AI를 만들기로 했는데

 


작동방식을 정리하면
1. 무작위로 연결된 뉴런집합체를 만든다. (이 뉴런들은 단순히 두개의 값을 비교하여 차를 반환한다)

2. 입력에 따라 뉴런들을 활성화 시키고 출력된 값에 따라 행동시킨다. 

3. 결과에 따라 보상이나 처벌을 준다. 보상은 활성화된 뉴런들에 가중치를 주고 처벌은 가중치를 감소시킨다.

4. 1번으로 돌아간다

 

인공신경망또한 근본적인 작동방식은 유전알고리즘과 비슷하다

차이점은 유전알고리즘은 개체를 바꿔가면서 찾아내지만

인공신경망은 이미 정답인 개체가 존재하며 그 개체를 찾아내는 작업만 진행할 뿐이다

 

 

https://www.hani.co.kr/arti/science/science_general/755976.html
단순히 차를 반환하는것은 동작의 최소단위를 구현하기 위함일뿐이라 필요에 따라 다른 함수로 교체해도 된다

가령 마인크래프트를 예로 들어보자 초기에는 레드스톤과 레드스톤 토치만으로 모든 회로를 구현했지만 현재는 회로밀도를 높이기 위해 리피터나 비교기들을 섞어가며 사용하는것과 같다

그러므로 위의 차반환은 일종의 한개의 트랜지스터일뿐이라 각종 유용한 연산으로 치환해도 된다

 

 


더 많은 복잡도를 원한다면 다층레이어를 구성하면 된다

레이어의 출력을 다시 입력으로 받아서 처리하는것이다

예를들어 위와같은 차반환만 들어있는 방식은 말그대로 차만 반환하기 때문에 사칙연산의 결과값을 얻어내기 위해서는 다층구조가 필요하다.

 

 

https://www.youtube.com/watch?v=ScIrkTgwQiI

 

이 동영상은 전에 만들었던 한개의 레이어로 무작위로 배치된 뉴런들이 외부 자극을 받아 활성화 되고

보상에 따라 연결이 강화되거나 약화됨으로서 자연스레 정답인 뉴런들만이 남는것을 보여준다

 

 

 

https://www.kidsdiscover.net/brain-development.php

 

참고로 인간의 뇌도 시냅스 가지치기라고 하여 이것과 동일한 작용이 일어난다

사실 당연하다

왜냐하면 인공신경망이 인간의 뇌를 모방해서 만든것이기 때문이다

인간의 뇌는 이 비활성화 된 세포들도 에너지를 소비하기 때문에 일부를 불활성정도가 아니라 아예 제거를 해버린다

때문에 사람의 경우 부정피드백이 너무 많이 들어오면 우울증같은 기능장애를 유발한다고 한다.

근데 사실 이건 AI도 마찬가지라 피드백을 어떻게 줄지 잘 설계해야한다.

 

그리고 인간의 경우는 긍정피드백은 미엘린이 담당한다

수초 혹은 말이집이라고도 하며 전달속도를 늘리고 신호를 증폭시킨다.

즉 가중치가 증가된다

 

 

이러한 작동원리로 인하여 뉴런 하나하나의 결과값은 영향이 거의 없고 집합의 결과에 영향을 받기 때문에 일부분이 손상되어도 문제없이 작동한다.

 

인간의 뇌는 20%만 쓴다는 말도 들어봤을것이다.

위와같은 과정을 거치기에 당연히 일부만 활성화 되어야 정상이고

모든 뉴런세포가 활성화 되면 동일한 출력을 내뿜기만 하는 뇌전증에 불과하게 된다.

 

 

 

 

그런데 보다시피 레이어는 처리에 한계가 있다.

가령 특정 오브젝트의 개체를 인식하여 오브젝트의 위치에 따라 처리하게 하려는데

출력이 하나뿐이므로 서로 간섭을 일으킨다

 

 

때문에 이 레이어들을 엮어서 집합체를 만드는데 이것을 모델 혹은 네트워크라고 한다

 

 

 

모델에서는 각 레이어의 결과값을 입력값으로 받아 재처리할수 있다

따라서 오브젝트를 인식하거나 단어를 인식하여 처리하는등의 고차원 처리가 가능하다


위의 경우는

1. 위치를 판별하는 레이어

2. 화상을 인식하는 레이어

3. 움직임을 담당하는 레이어

이렇게 3개의 레이어가 필요하겠다

 

 

인간의 뇌도 이와같은 처리경로를 거친다

 

 

 

 

 

 

 

 

 

https://thebrain.mcgill.ca/flash/a/a_02/a_02_cr/a_02_cr_vis/a_02_cr_vis.html

 

https://www.waece.org/cd_morelia2006/ponencias/stoodley.htm

 

 

시각을 1차적으로 처리후 What경로와 Where경로를 거쳐 다른 레이어로 전달된다

 

 

그런데 인공신경망에는 커다란 단점이 있는데 보상과 처벌에 따라 학습되는것이기 때문에

그것을 판별할 시스템이 필요하다는 점이다

이것때문에 시각데이터에 라벨링 하는 과정이 들어가며 이것은 오로지 사람손으로 이루어진다

그래서 오토라벨링을 만드려고 애를 쓰지만 오토라벨링 또한 그것을 판별해줄 데이터는 사람손으로 만들어야 한다

 

생물의 경우는 정상적인 보상회로를 갖춘 생물만 살아남으므로 문제되지 않는다. 

그래서 최근에 개발되는것은 시뮬레이션 게임을 만들어서 그곳에서 학습시키는것이다.

 

 

 

그런데 인공신경망 또한 local minima문제를 가지고 있다

인간의 경우엔 두개의 뇌가 각기 판단후 뇌량을 통해 보강함으로서 상쇄시키려 한다

 

이 문제는 다수의 모델을 운용함으로서 해결할수 있다

 

 

그러니까 인공신경망은 군체의 결과가 판단의 주체이며

기존의 AI는 방정식의 결과가 판단의 주체이기 때문에 완전히 다른 방식의 AI라고 할 수 있다

 

 

 

'AI' 카테고리의 다른 글

라마샵 LLaMaSharp 사용법  (0) 2025.05.24
AI 환각현상과 분리뇌 현상의 유사성  (0) 2025.02.04
Rodin 사용법  (0) 2025.02.04
posted by 모카쨩
2025. 2. 4. 13:24 AI

 

AI hallucination

 

AI 환각 현상은 생성형 인공지능(AI)이 없는 정보를 지어내거나 왜곡하는 현상을 말합니다. 예를 들어, 챗GPT와 같은 AI 모델이 실제로 존재하지 않는 역사적 사건에 대해 질문을 받았을 때, 마치 실제 있었던 일처럼 상세한 설명을 만들어내는 경우가 이에 해당한다

 

분리뇌 현상은 좌뇌와 우뇌를 연결하는 뇌량이 절단된 환자들에게서 나타나는 독특한 행동 패턴을 의미합니다. 예를 들어, 우뇌에만 특정 이미지를 보여주고 왜 그 이미지를 선택했는지 좌뇌에 질문하면, 좌뇌는 실제 이유를 알지 못함에도 불구하고 그럴듯한 이야기를 만들어냅니다. 이는 뇌가 불완전한 정보를 바탕으로 그럴듯한 이야기를 만들어내는 능력을 가지고 있음을 보여준다.

 

이러한 유사성은 인간의 뇌와 AI가 정보를 처리하고 해석하는 방식에서 공통적인 메커니즘이 존재할 수 있음을 암시합니다. AI의 환각 현상은 단순한 오류가 아니라, 인간과 유사한 방식으로 정보를 처리하는 과정에서 발생하는 필연적인 결과일지도 모른다.

 

 

사실 어떻게 보면 당연한 것일지도 모른다

노드들의 연결을 잘라버려 반토막이 났으니 정상적인 기능을 못 할수밖에

 

 

실제로 있었던 분리뇌 실험 사례들

1. 빛 자극 실험
왼쪽 시야(우뇌)와 오른쪽 시야(좌뇌)에 각각 빛을 번쩍였다. 오른쪽 시야에 빛을 비췄을 때는 "빛이 보였다"고 말할 수 있었지만, 왼쪽 시야에 비췄을 때는 "아무것도 안 보인다"고 하였다. 그런데 웃긴 것은, 어디에서 빛이 번쩍였는지 손으로 가리키라고 하면 정확하게 가리켰다는 점이다. 결국 우뇌가 정보를 갖고 있긴 하였으나, 언어를 담당하는 좌뇌와 연결이 끊어지면서 말로는 설명을 못 하였다.

2. 단어 인식 실험
오른쪽 시야(좌뇌)와 왼쪽 시야(우뇌)에 각각 다른 단어를 보여주고, 해당 단어와 관련된 물건을 집게 하였다. 오른쪽 시야에 ‘열쇠(key)’를 보여주면, 오른손으로 열쇠를 집고 "열쇠"라고 말하였다. 그런데 왼쪽 시야에 ‘열쇠’를 보여주었을 때, 왼손으로는 열쇠를 잘 집었으나, 그게 무엇인지 말로는 설명하지 못 하였다. 즉, 우뇌는 정보를 갖고 있었으나, 언어로 표현하는 기능이 없어 답답한 상황이 발생한 것이다.

3. 장면-도구 연관 실험
왼쪽 시야(우뇌)에는 눈보라 치는 장면을, 오른쪽 시야(좌뇌)에는 닭발 사진을 보여주었다. 그리고 본 것과 어울리는 그림을 고르라고 하였더니, 오른손은 닭을, 왼손은 삽을 집었다. 문제는 삽을 왜 골랐냐고 물었을 때이다. "지저분한 닭장을 치우려면 삽이 필요하니까요."라고 대답하였다. 사실 우뇌는 눈보라 장면을 보았기 때문에 삽을 고른 것이었으나, 좌뇌는 그 사실을 모르고 대충 말 맞추는 식으로 설명을 지어낸 것이다.


대체적으로 좌뇌가 현상에 맞추어 합리화 하고 설명하는것을 볼수 있는데

이것은 AI의 환각현상과 놀랍도록 일치한다

 

진화학적으로 봤을때 이러한 오류처리들이 우뇌의 어떤 노드들이 처리하면서 보정되었을것이나 

뇌량이 절단되면서 기능을 상실하게 된것으로 볼수있다.

 

 

 

 

 

 

 

 

 

 

 

 

'AI' 카테고리의 다른 글

인공신경망 작동 원리  (0) 2025.02.18
Rodin 사용법  (0) 2025.02.04
AI 영상 생성 Sora 후기  (0) 2025.02.03
posted by 모카쨩
2025. 2. 4. 06:55 AI

 

 

 

 

 

 

 

 

결제

 

 

 

 

 

 

이번엔 생성 누르고 멀티뷰 옵션을 줬다

 

 

생성된 퀄이 별로길래 Redo실행

 

 

 

너 모델링 진짜 못한다

 

 

 

 

 

멀티뷰 생성

아놔

 

'AI' 카테고리의 다른 글

AI 환각현상과 분리뇌 현상의 유사성  (0) 2025.02.04
AI 영상 생성 Sora 후기  (0) 2025.02.03
Qwen 사용법  (0) 2025.01.30
posted by 모카쨩

저사양 유저용 블로그 진입