2026년 1월 16일 금요일

인공지능에서 정규화(Normalizing)와 표준화(Standardizing)

 "Normalizing" a vector most often means dividing by a norm of the vector,
for example, to make the Euclidean length of the vector equal to one. In the NN literature, "normalizing" also often refers to rescaling by the minimum and range of the vector, to make all the elements lie between 0 and 1. 

- 정규화(Normalizing) : 데이터 혹은 벡터를 정규화 한다는 것은 벡터의 크기로 벡터를 나누어 크기(Euclidean Length)가 1이 되도록 하는 것이다. 인공지능 영역에서는 정규화 과정을 종종 모든 데이터가 0과 1 사이의 크기를 갖도록 재조정(rescaling)하는 것으로 사용된다.

"Standardizing" a vector most often means subtracting a measure of location and dividing by a measure of scale. For example, if the vector contains random values with a Gaussian distribution, you might subtract the mean and divide by the standard deviation, thereby obtaining a "standard normal" random variable with mean 0 and standard deviation 1. 

 - 표준화(Standardizing - 이거 뭐라읽어야 하나 스탠다디자이징??): 모든 벡터의 평균값을 빼고, 측정된 표준편차로 나누는 작업. 예를 들어 Gaussian 분포(distribution)을 갖는 랜덤 값을 갖는 벡터를 평균이 0이되고 표준 편차가 1이 되는 "standard normal" 랜덤 변수로 만다는 작업을 잃컫는다.

 그럼 뭘써야 하나 그때 그때 다르다. 어쨌든 써야지 만족할 만한 성능을 기대할 수 있다.

Multilayer Perceptron(흔히들 말하는 클래식 인공지능, 다층 fully-connected layer로 구성된 NN)의 경우 입력값이 0과 1 사이어야 한다. 하지만, 사실 어떠한 요구조건은 아니지만 데이터의 평균값이 0이면 좋다. 그래서 데이터가 0과 1사이의 값이 되게만 만드는 행위는 좋은 선택이 아니다.  

 그래서 학습과정 중 최적화 단계의 수치해석적 향상을 위해선 Stadardizing을 입력과 결과값 모두에 적용하는 것이 좋아 보인다. 

참고 자료:

http://www.faqs.org/faqs/ai-faq/neural-nets/part2/

 

인공지능에서 데이터 셋(data set), 샘플(sample), 혹은 모수(population)

  크게 세 종류로 분류된다. 

training set: 입력데이터를 적용해서 실제 결과와 이상적인 결과의 에러를 측정하여 네트워크의 값들을 적절하게 업데이트하는데 사용하는 데이터.

validation set: 위와 같은 학습 중간중간에 학습에 투여되지 않은 데이터를 입력으로 넣어서 마찬가지의 에러를 측정한다. 그래서 과적합(overfitting)을 측정하는데 사용한다. 

test set: 위의 두 종류의 데이터로 최종 학습된 인공지능의 최종 성능을 평가 하기 위한 또 다른 데이터 셋.

종종 validation 과 test set이 혼동된다.

다음은 Ripley가 1996에 쓴 책 Pattern Recognition and Neural Networks (p.354)에 정의한 내용이다.

Training set:
    A set of examples used for learning, that is to fit the parameters [i.e., weights] of the classifier.  - 학습에 사용하는 데이터, 분류기의 내부 파라미터(가중치)를 적절하게 결정하는데 사용한다.


Validation set:
    A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network. - 분류기의 외부 파라미터(가중치가 아니라 일종의 외부 변수 - 네트워크 깊이, 학습법, 평가법, 학습횟수, 등)을 선택하는데 사용하는 데이터.


Test set:
    A set of examples used only to assess the performance [generalization] of a fully-specified classifier. - 완전히 결정된 분류기의 성능을 평가하기 위한 데이터 셋.

 참고자료:

 Archive-name: ai-faq/neural-nets/part1
Last-modified: 2002-05-17
URL: ftp://ftp.sas.com/pub/neural/FAQ.html
Maintainer: saswss@unx.sas.com (Warren S. Sarle)

Artificial Neural Network 란?

 작은 메모리를 갖는 간단한 연산기가 숫자데이터를 다루고,

이러한 기본 단위의 입력 및 출력 데이터를 네트워크로 난잡하게 연결한 

정리되지 않은 방구석.

참고자료:

Archive-name: ai-faq/neural-nets/part1
Last-modified: 2002-05-17
URL: ftp://ftp.sas.com/pub/neural/FAQ.html
Maintainer: saswss@unx.sas.com (Warren S. Sarle)

이 시점에서 지능이란?

 뭐 지능이란? 이라고 고차원적이고 철학적인 질문이 될 수 있는데 아시다시피 그냥 뉴론의 네트워크 구조 Neural Network임이 생물학적이든 전기공학적이든 기본 토대인 것 같다. 

그래서 지능은 Neural Network 구조 이고 지금으로썬 Biological Neural Network와 Artificial Neural Network가 존재 하고 있고 Biological Neural Network의 존폐가 아주 위태로운 상황이다.

결론은 

Biological Neural Network는 인간꺼. 

Artificial Neural Network는 기계꺼 실제론 Nvidia의 그래픽 카드 꺼.

참고자료:

Archive-name: ai-faq/neural-nets/part1
Last-modified: 2002-05-17
URL: ftp://ftp.sas.com/pub/neural/FAQ.html
Maintainer: saswss@unx.sas.com (Warren S. Sarle)

쿠리어(Courier) 폰트.

 모든 글자가 동일한 폭을 갖고 있는 고정폭(Monospace) 폰트의 대표격이다. 모든 글자라곤 하지만 대부분 영어에만 해당된다. 그래서 어디에 사용되냐면, 프로그래밍/코딩에 주로 사용된다. 이건 내 영역이라 먼저 썼지만, 역사적으로 페이당 분량을 산정해서 먹고사는 영역에서(소설, 영화 작가들) 원고료 산정 방식때문에 많이 사용되었던 듯 싶다. 

 그래서 내 경우 리눅스 터미널, 코드 에디터(EMACS, Visual Studio Code, PyCharm 등)의 기본 폰트로 적극 사용해라라는 메시지를 기억이 가물가물해지는 나에게 남겨두기 위해 여기에 써둔다. 

2026년 1월 14일 수요일

무심코 근 20년간 써왔던 회귀분석 Regression의 정체 드디어 밣혀져.

 선형대수를 배우면서 회귀분석이라고 배우진 않았지만, 같은 작업을 하면서 근 20년간 회귀분석을 해온 듯 싶다. 나중에는 회귀분석이라는 용어로 regression이라는 것을 알았고 classification의 반대 급부에 있는 것이라 머릿 속에 자리 잡았지 용어와 기능이 서로 맞지 않는 것에 대해서 의문시 하지 않았다. 

 "값추정", "값맞추기"가 회귀분석이라고 하는 것의 정확한 용어가 되어야 알맞을 것 같은데 "회귀본능"으로 알고 있는 회귀+분석이라니.

 그 정체를 책을 보다가 알아 버렸다. 

"이 이상한 이름은 프랜시스 골턴(Francis Galton)이 키가 큰 사람의 자녀가 부모보다 작은 경향이 있다는 사실을 연구하면서 소개한 통계한 용어입니다. 부모보다 자녀가 더 작기 때문에 이를 평균으로 회귀한다고 불렀습니다. 그 후 프랜시스가 두 변수 사이의 상관관계를 분석하기 위해 사용한 방법에 이 이름을 붙였습니다."

 - 핸즈온 머신러닝(오렐리앙 제롱 지음, 박혜선 옮김)


regression 

미국∙영국 [ rɪˈɡreʃn ]미국식 [ rɪˈɡreʃn ]

명사 퇴행, 퇴보; 회귀

- 네이버 사전


자매품으로 "리즈시절"이라는 용어도 있다. 

https://www.goal.com/kr/%EB%89%B4%EC%8A%A4/a/q5yd8j6s5qab14dhdu92ozksl


써 봄직한 auto-cpufreq

 사과무니가 그려져 있는 랩탑 컴퓨터가 갖고 싶어 하진 않았지만, 그 혜자로운 배터리 지속 기간은 너무나도 부러웠다. 내가 랩탑을 쓰는 건지 랩탑 밥 챙겨주려고 쓰는 건지 도통 편리하지가 않다. 

Debian 패키지 안에 cpufrequtils라는 패키지가 기본 설치되어 관리해 주지만 앞서 이야기 한 것 같이 많이 아쉽다.

그런데 그 대체제가 있었던 것 같다. 심지어 3.0 버전대가 버젓이 존재하고 있었다. auto-cpufreq라고 하지만, debain 패키지 관리자에서는 관리되지 않고 있는 것 같다. 

소스코드 도적대인 github에서 내려받아 컴파일 하고 설치하는 방법밖에 없는 것 같다. 다른 방법이 있긴 한데 이거 하나 설치하자고 snap 패키지 관리자를 설치하기는 마음에 들지 않는다.

$ git clone https://github.com/AdnanHodzic/auto-cpufreq.git

설치하기

$ cd auto-cpufreq

$ sudo ./auto-cpufreq-installer

설치된 후 버전확인과 시스템에 등록된 상태 확인하기

$ auto-cpufreq --version

$ sudo systemctl status auto-cpufreq

재부팅 전까지만 사용해 보기

$ sudo auto-cpufreq --live

영구히 서비스로 등록

$ sudo auto-cpufreq --install


이 골방에 와서 auto-cpufreq 설치를 혹여나 시도할 수 있으니 주의사항도 남겨둔다. 

debian에 이미 설치된 cpufrequtils와 서로 충돌한다. 다음과 같이 cpufrequtils를 시스템에서 내려야 한다.

$ sudo systemctl stop power-profiles-daemon.service

$ sudo systemctl mask power-profiles-daemon.service

$ sudo systemctl stop tlp.service # if TLP is installed

$ sudo systemctl mask tlp.service # if TLP is installed

# Similarly for any other cpufreq-related service (e.g., cpufrequtils)

재부팅에도 더이상 자동 실행되지 않도록 해주어야 한다. 

$ sudo update-rc.d -f cpufrequtils remove # To remove startup links

$ sudo systemctl stop cpufrequtils.service

# or simply uninstall the package

$ sudo apt remove cpufrequtils


2026년 1월 7일 수요일

Windows + WSL + TensorFlow + CUDA 설치하기

 아쉽게도 tensorflow가 native로 윈도우를 더 이상 지원하지 않기로 한 것 같다. 여기 저기 검색해 본 결과 JAX랑 PyTorch 쓰라고 하네. 당장 짜놓은 Tensorflow+keras 조합을 바꾸진 못할 것 같다.

당분간은 본업용 윈도우 시스템과 실험용 리눅스 시스템을 동시에 굴려서 실험을 해야 잘못된 실험(결과값을 reverse scaling하지 못해서 ....)을 다시 할 수 있을 것 같다. 

그럼 본업은 유지해야 하기 때문에 윈도우를 갈아 업을 순 없고 가능한 조합은 Windows + WSL + CUDA + Tensorflow + Keras 인것 같다.

그래서 먼저 WSL 설치하고 CUDA 설치하고 tensorflow를 설치해야 겠다.

1. WSL 설치

1.1. linux용 windows 하위 시스템 설치

PS C:\Windows\system32> wsl --install

재부팅하라니 재부팅을 해주어야 겠다.

1.2. 사용가능한 linux 배포판 확인하기

PS C:\Windows\system32> wsl --list --online

1.3. linux 배포판 설치

나는 자주 갈아 업는 배포판은 귀찮기 때문에 Ubuntu 24.04 LTS 버전을 설치하도록 하겠다.

PS C:\Windows\system32> wsl --install Ubuntu-24.04

1.4. Ubuntu 환경 업데이트

PS C:\Windows\system32> wsl 

user@DESKTOP:/mnt/c/Users/user$ sudo apt update

user@DESKTOP:/mnt/c/Users/user$ sudo apt upgrade


2. CUDA 환경 설치

Nvidia의 드라이버 구조와 cuda 는 다소 난잡하다. 

2.1. Nvidia 드라이버 설치

윈도우 시스템에 nvidia 드라이버가 설치된 상태로 wsl을 설치해서 그런지, 이미 설치되어 있는 듯 싶다. 확인만 하고 넘어 가자.

...$ nvidia-smi

드라이버 버전 확인 요망(내껀 드라이버 버전 576.88이다. CUDA도 설치 되어 있네 12.9)

2.2. CUDA Toolkit 설치

앞서 이야기 했듯이 난잡하다. nvidia 드라이버 버전을 기준으로 다른 패키지들 tensorflow와 cuda-toolkit의 매칭되는 버전을 찾아 보도록 해야 겠다. 다시 설치하고 그러기 싫다.

우선 시스템이 제공해 줄 수 있는 버전을 확인해 본다.

...$ sudo apt search nvidia-cuda-tool

nvidia-cuda-toolkit이 설치할 수 있게 검색되며 버전은 12.0.140 이다.

그럼 설치한다.

...$ sudo apt install nvidia-cuda-toolkit

오래 걸린다. 잠깐 정리하고 넘어가자.

nvidia 드라이버 버전(576.88), CUDA 버전(12.9), nvidia-cuda-toolkit 버전(12.0.140)

설치된 nvidia관련 패키지들 리스트들이다.

...$ apt list --installed | grep nvidia

libnvidia-compute-535/noble-updates,noble-security,now 535.274.02-0ubuntu0.24.04.2 amd64 [installed,automatic]

libnvidia-ml-dev/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-dev/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-gdb/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-cuda-toolkit-doc/noble,now 12.0.1-4build4 all [installed,automatic]

nvidia-cuda-toolkit/noble,now 12.0.140~12.0.1-4build4 amd64 [installed]

nvidia-opencl-dev/noble,now 12.0.140~12.0.1-4build4 amd64 [installed,automatic]

nvidia-profiler/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

nvidia-visual-profiler/noble,now 12.0.146~12.0.1-4build4 amd64 [installed,automatic]

어 근데 cudnn은 없네 이것도 필요한 것으로 기억하는데 이것도 설치해야 겠다.

...$ sudo apt install nvidia-cudnn

현재 설치버전은 8.9.2.26이다. 버전이 무슨 암호 같다. 그 전에 너무 길다.

이젠 python 설치와 관련 패키지 설치인것 같다.


3. python 설치

다행이도 이미 설치된 버전은 3.12.3이다.

...$ python3

Python 3.12.3 (main, Nov  6 ...)

>>> quit()

그럼 관련 조합을 정리해 보자.

tensorflow-2.15 + cuda-12.2 + cudnn-8.9 -> corresponding NVIDIA Driver 535

약간 다르긴 하지만 이 조합 밖에 없다. 이걸로 밀어 부치자.

3.1. 가상 환경 설치하기

개발환경의 패키지 버전과 시스템이 관리하는 버전의 충돌을 경험해 보고 싶지 않으면 python 가상환경을 설치하자. 

...$ sudo apt install python3-venv

3.2. tensorflow를 위한 가상환경 생성

그럼 하얀 도화지를 준비하자.

...$ python3 -m venv tf-env

3.3. 생성된 가상 환경 활성화 하기

...$ source ./tf-env/bin/activate

(tf-env) ...$ 

가상환경 종료는 맨 마지막에 해주어야 하지만, 참고로 다음과 같이

(tf-env) ...$ deactivate

아무튼 가상환경 하에서 필요한 tensorflow-2.15버전을 설치한다.

3.4. tensorflow 2.15 설치

(tf-env) ...$ pip install tensorflow[and-cuda]==2.15

에휴 없다. 다시 호환표를 보자.

https://www.tensorflow.org/install/source?hl=ko#gpu

....

텐서플로우-2.17.0 3.9-3.12 클랭 17.0.6 바젤 6.5.0 8.9 12.3

텐서플로우-2.16.1 3.9-3.12 클랭 17.0.6 바젤 6.5.0 8.9 12.3

텐서플로우-2.15.0 3.9-3.11 클랭 16.0.0 바젤 6.1.0 8.9 12.2

...

맞는 조합이 없다. python 3.12이고 cuDNN 8.9고 CUDA는 12.9다.

모른겠다. 2.17버전 설치한다.

(tf-env) ...$ pip install tensorflow[and-cuda]==2.17

엉망 진창이지만 설치가 된다. 근데 오래 걸린다.

3.6. 설치 확인

(tf-env) ...$ python3 -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"

너무 오래 걸린다. 윈도우 환경으로 넘어가서 visual studio code 환경 설정해야 겠다.

4. visual studio code 환경 설정

visual studio code는 윈도우에 설치하고 python과 tensorflow는 윈도우 안에 있는 리눅스 시스템에 설치되어 있다. 이 둘 간의 OS를 넘나드는 다리를 만들어 주어야 한다.

visual studio code를 실행하고 좌측 탭의 extensions를 선택하고 "Remote - WSL"을 검색한다.

근데 WSL 밖에 없다. 설명을 보아 하니 WSL에 있는 폴더를 열 수 있다고 한다. 이것 설치한다.

그리고 좌측 하단의 원격 연결 버튼 ( >< 모양 아이콘)을 클릭하고 "Connect to WSL"을 선택한다.

뭔가 설치한 Ubuntu-24.04와 연결하는 것 같다.

File -> Open Folder 하고  WSL 디렉토리 선택하고 test.py 파일을 하나 만들면 필요한 extensions들을 추천해 주는데 다 설치하자. 그럼 또 가상 환경 만들라고 한다. 이미 만들어 놓은 건 어쩌고 만들라고 하는지 기존것 로딩하는 것은 없나 보다. 

아 귀찬다. /mnt/c/Users/usr/tf-env를 /home/user로 복사해 오자. 나머지는 내일 하는 것으로.



집중력과 나이 그리고 귀찮음.

 나이가 들면 집중력이 전반적으로 줄어 드는 것 같다. 체력이 먼저 줄어 드는 것으로 대부분 느끼지만 이건 집중력이 전반적으로 줄어 들면서 활력이 줄어 결과적으로 나타나는 현상에 불가하다. 그래서 무엇 보다도 집중력 저하가 나이가 들어서 나타나는 가장 중요한 유실이 아닌가 싶다. 

좀더 그 근원을 쫒아 가면 귀찮음이 늘어서 집중력이 줄어드는 것 아닌가 하는 생각도 든다.

 

"집중력 + 귀찮음" 총량의 법칙

2026년 1월 4일 일요일

[책] Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow

 3판까지 나온 상태인 것 같다. 가격이 제법 나가서 사서 살펴보진 못했다. (원서는 10만원 선이고, 번역서는 5만원 선으로 검색된다.) 둘다 사서보기 부담 스럽다. 강의에 써보고 싶은데 접근하기가 쉽지 않다.

이론적으로 매몰되지 않고 그렇다고 따라 하기 식으로 매뉴얼 처럼되어 있는 책도 아닌 그 사이 어딘가에 있는 책같다. 들여다 봐야 할 것 도 많고 할일도 많은데 선 듯 움직여 지지 않는다. 그래서 되세김하기 위해 여기에 기록으로 남겨 볼때 마다 기억나게 남겨둔다.