Professional Documents
Culture Documents
Functional Analysis
Functional Analysis
Burak Bayramlı
Sayılar ve Kuramlar
https://burakbayramli.github.io/dersblog/sk/
https://github.com/burakbayramli/classnotes
Ders 1
Önce Reel Analiz (Real Analysis) ile başlayalım. Fonksiyonel Analizdeki pek çok
kavram Reel Analiz ile benzer (ama daha geneldir).
Reel Çizgi
Reel sayıların olduğu küme R’ye geometrik bir açıdan “reel çizgi” ismi de verilir.
Reel çizgi üzerinde uzaklık kavramı, mesela iki nokta x, y arasında
d(x, y) = |x − y|
1
f:N→R
Dizimizi
olarak gösterebiliriz.
Yaklaşmak (Convergence)
Açık bir şekilde görüleceği üzere alttaki dizi
1 1 1
1, , , , ...
2 3 4
.1, .01, .02, .001, .002, .0001, .0002, .00001, .00002, ...
Bu dizi muhakkak sıfıra “yakınlaşıyor”, fakat terimler düzenli bir şekilde sıfıra
yaklaşmıyorlar. Her ikinci adımda birazcık sapıyorlar. Ya da şu dizi
Bu dizi gittikçe .2’ye “yakınlaşıyor”, fakat bu dizinin .2’ye yaklaştığı iddia edile-
mez. Gerçek limit 1.9 olmalı, 2 değil. Ne olduğu belli olmayan bir “gittikçe
yaklaşma” tanımına değil, bizim aslında “gelişigüzel yakınlık (arbitrarily close)”
tanımına ihtiyacımız var.
Bu fikri en iyi yakalayabilen 1820’li yıllarda Augustin Cauchy oldu. Eşitsizlikleri
kullanarak “herhangi / gelişigüzel yakınlık” kavramını formüle eden bir tanım
bulmayı başardı. Bu şekilde limit kavramı gayet açık matematiksel eşitliszlikler
ile gösterilebildi.
Tanım: Bir Dizinin Limiti
2
{sn }’nin reel sayılardan müteşekkil bir dizi olduğunu düşünelim. {sn }’nin bir reel
sayı L’e yaklaştığını söyleriz, ve bunu
lim sn = L
n→∞
olarak belirtiriz. Ya da
sn → L olur, n → ∞ iken
eğer her > 0 için öyle bir tam sayı N var ise, ki bu N şu şartlara uymalı
|sn − L| <
n2 1
lim 2
=
n→∞ 2n + 1 2
olduğunu ispat edelim. Yanlız şunu belirtelim, üstteki tanım limitin 1/2 olacağını
hesaplamak tekniği olarak verilmiyor. İfade limit kavramına kesin bir tanım ge-
tiriyor ama o limiti hesaplamak için kesin bir metot sunmuyor. Neyse ki çoğumuz
bu hesabı yapmak için yeterince Calculus hatırlıyoruz, böylece limitin doğruluğunu
ispatlamadan önce ne olduğunu bulabiliriz.
n2 1 1
lim = lim =
n→∞ 2n2 + 1 n→∞ 2 + 1/n2 limn→∞ (2 + 1/n2 )
3
1 1
= =
2 + limn→∞ (1/n2 ) 2
n2
1
2n2 + 1 − 2 <
n2 1 2n2 2n2 + 1
− = −
2n2 + 1 2 2(2n2 + 1) 2(2n2 + 1)
2n2 − 2n2 − 1 −1
= 2
==
2(2n + 1) 2(2n2 + 1)
1
<
2(2n2 + 1)
olmalı, ya da
1
4n2 + 2 >
Dikkat, tersine çevirince küçüklük işareti büyüklük oldu.
Bu ifadeye uyan en küçük n, aradığımız N. O zaman
2 1 1
N > −2
4
ifadesine uyan her tam sayı N bizim için uygun. İlla ki en küçük N olması gerek-
mez, en rahat olan N biraz büyükçe olabilir, mesela eğer sağ taraftaki 1/4 terim-
ine (sağ tarafta daha fazlası var, ama eksi işareti bu terimi daha küçültecek nasıl
olsa) eşit bir şeyleri sol tarafta istiyorsak, onun karesini N olarak kabul ederiz,
4
1
N> √
2
deriz.
Bu örneğin bize verdiği asıl ders, aslında, tanımın bize limit teorisini geliştirmek
için teorik / kesin (rigourous) bir yöntem sunması ama bu limitlerin hesabını
yapmak için pratik bir yöntem olmaması. Bir limitin doğruluğunu hesaplamak
için nadiren böyle bir yönteme başvurulur.
Alt Dizinler (Subsequences)
şeklindeki bir dizinin içinde iki tane daha dizin olduğu görülebilir. Bunlardan
biri
1, 2, 3, 4, 5, ...
Diğeri
Bu dizin içinde dizin kavramını temsil etmek için “altdizin” kelimesini kullanacağız.
Çoğunlukla bir dizini incelemenin en iyi yolu onun altdızinlerine bakmaktır. Ama
altdizinlerin daha derli toplu bir tanımı ne olabilir acaba? Üstte kabaca yaptığımız
kavramın formel matematiksel bir tanımına ihtiyacımız var.
Tanım
s1 , s2 , s3 , s4 , ...
demek istiyoruz ki
olmalı, altdizinde kullanılan indekslerin her biri, bir öncekinden büyük olmalı.
1, 2, 3, 4, 5, ...
5
dizini,
|sn | 6 M
Teori
Her yakınsak (convergent) dizi sınırlıdır. Bu teorinin ispatını vermeyeceğiz, fakat
sınırlı olmayan bir dizinin limiti olamayacağı açıktır.
Cauchy Kriteri
Bir dizinin hangi özelliği onun yakınsaklığını karakterize eder? “Karakterize
eder” kelimeleriyle gerekli ve yeterli (necessary and sufficient) bir durum arıyoruz
ki bu durum gerçekleştiğinde dizinin yakınlaştığını bilelim.
Her türlü diziye uygulanabilen böyle bir karakterizasyon Cauchy tarafından keşfedildi.
Cauchy’nin bulduğu tanımın ilginç bir tarafı var, hiçbir nihai limit değerine refer-
ans yapmıyor. Sadece, son derece gevşek bir şekilde, bir dizinin terimleri bir-
biriyle rasgele (arbitrary) bağlamda, eninde sonunda (eventually) yaklaşırsa, o
dizinin yakınsayacağını söylüyor. Kriter söyle:
Bir dizi {sn } yakınsaktır, eğer, ve sadece eğer her > 0 için bir tamsayı N var ise,
ki
6
|sn − sm | <
|sk − L| <
2
|sn − sm | 6 |sn − L| + |L − sm | < + <
2 2
7
Sonra K’yi öyle seçelim ki, her k > K için
olsun. Diyelim ki n > N. Şimdi m’i nk ’nin N’den büyük olan herhangi bir
değerine eşitleyelim ki k > K olsun. Bu değer için sm = snk ’dir.
Birinci eşitsizlik, üçgen eşitsizliğinden geliyor. Daha sonra elde edilen terimlerin
bildiğimiz değerlerini yerine koyuyoruz, sn → L olduğunu görüyoruz (üstteki
formülün başı ve sonunu birleştirirsek, elde ettiğimiz sonuç). İspat tamamlandı.
8
Ders 2
Süreklilik
Tanım
S ⊂ R, f : S → R bir fonksiyon olsun, ve c ∈ S bir sayı olsun. “f’in c’de sürekli
olduğu” söylenir, şu durumda: Eğer her > 0 için bir δ > 0 var ise, öyle ki ne
zaman x ∈ S ve |x − c| < δ işe, o zaman |f(x) − f(c)| < doğrudur.
Eğer f : S → R her c ∈ S için doğru ise, yani bir c noktası değil tüm c’ler için
geçerli ise, o zaman f’in sürekli olduğunu söyleriz. Yani nokta belirtmeye ihtiyaç
kalmaz.
Üstteki tanım Analizde doğru anlaşılması gereken en önemli teorilerden biridir,
ve tam anlaması pek kolay olmayabilir. Dikkat edilirse δ, hem ’a hem de c’ye
bağlı. Yani her c ∈ S için aynı δ seçilmiyor.
Ayrıca sürekli fonksiyonların tanımının limitlerin tanımına benziyor olması raslantı
değil, sürekli fonksiyonların önemli bir özelliği zaten onların düzgün limitleri ol-
maları.
Tanımın işlemesinde mutlak değer (absolute value, || işareti) kritik bir rol oynuyor.
Grafiksel olarak şöyle gösterebiliriz. Bir fonksiyonun değerleri etrafında, yukarı,
aşağı olmak üzere kadar bir pencere tanımlıyoruz (yeşil olarak görülen bölüm).
Şimdi örnekte c = 2 etrafında, yani x bazında öyle bir başka pencere tanımlayalım
ki, bu penceredeki değerler tamamen yeşil kısıma tekabül eden değerlerin içinde
kalsın. Bu şekilde tek bir pencere bulabildiğimiz anda iş tamamdır. Ve bunu tüm
> 0 için yapabiliyorsak, o fonksiyon sürekli demektir.
1
x < 5 2x
f(x) =
x > 5 3x
x < 5 2x
f(x) =
x > 5 3x + 10
Fonksiyonun pürüzsüz (smooth) olmadığına dikkat, yani iki parçalı bir fonksiyon,
kesikli bir şekilde tanımlı, ama yine de sürekli.
Süreklilik için limitlere dayalı bir tanım daha açıklayıcı olabilir [1, sf. 125]. Bir iç
nokta (interior point) c için, y = f(x) o noktada sürekli denir eğer
lim = f(c)
x→c
ise. Yani bir noktadaki fonksiyon limiti eğer fonksiyonun o noktadaki değerine
eşit ise fonksiyon o noktada süreklidir.
2
Eşit Süreklilik (Uniform Continuity)
Süreklilik tanımında δ’nin c noktasına bağlı olduğunu söylemiştik. Ama bazı
durumlarda δ’nin bağımsız olması daha faydalıdır.
Tanım
S ⊂ R, f : S → R bir fonksiyon olsun. Farz edelim ki her > 0 için bir δ > 0
mevcut, ki x, c ∈ S ve |x − c| < δ olduğu zaman, |f(x) − f(c)| < . Bu durumlarda
fonksiyona eşit sürekli denir.
Eşit Sürekli bir fonksiyonun (normal) sürekli bir fonksiyon olacağını görmek zor
olmaz. Buradaki tek fark her seçilen > 0 için öyle bir δ > 0 seçiyoruz ki bu δ
her c ∈ S için ise yarıyor. Yani bu yeni tanıma göre artık δ, c’ye bağlı değil, sadece
’a bağlı. Tanımın yapıldığı arka plan, bölge (domain) bir fark yaratacak. Daha
büyük bir kümede eşit sürekli olmayan bir fonksiyon, daha ufak bir küme içinde
eşit sürekli haline gelebilecek.
Lipschitz Sürekliliği
Tanım
f : S → R bir fonksiyon olsun, öyle ki S içindeki her x, y için bir K sayısı mevcut,
ve tüm bunlarla alttaki eşitsizlik doğru
her x, y için üstteki hesabın daha az olacağı bir K vardır diyoruz ve bu K fonksiy-
onun her noktasında türevi için bir üst sınır olacaktır. Alttaki gibi bir resim
üzerinde anlatırsak,
3
söylediğimiz fonksiyonun hep beyaz koni dışında kalacağının garantisidir. O
koni dışında kalmak ta dolaylı olarak eğimin çok aşırı büyük olmaması anlamına
geliyor. Yani demek istiyoruz ki bu fonksiyon “patlamayacak”. Örnek olarak
sin(x2 ), ya da sin(1/x) Lipschitz değildir. Pek çok polinom, “normal” fonksiyon
Lipschitz’dir. İlla türevin mevcut olması bile gerekmez, mesela f(x) = |x|’in her
noktada türevi yoktur ama Lipschitz’dir/
Fakat dikkat edelim, aynen eşit süreklilikte olduğu gibi Lipschitz sürekliliğinde
de fonksiyonun tanımlandığı bölge (domain) çok önemlidir. Şimdi “sürekli” ke-
limesini kullanmamızın doğruluğunu kontrol edelim.
Teori
Her Lipschitz sürekli fonksiyon, aynı zamanda eşit sürekli bir fonksiyondur.
İspat
f : S → R olduğunu kabul edelim, ve öyle bir K sayısı olsun ki S içindeki her x
ve y için f(x) − f(y)| 6 K|x − y|. Bu Lipschitz süreklilik tanımının bir tekrarı. Bir
> 0 seçelim. Sonra δ = /K alalım. |x − y| < δ olacak şekilde her x, y ∈ S için
|f(x) − f(y)| 6 K|x − y| < Kδ = K =
K
Birinci eşitsizlik Lipschitz tanımından geliyor. Bu eşitsizliğin sağ tarafında diğer
bildiklerimizi yerine koyunca, elde ediyoruz.
Tamlık (Completeness)
Tanım
Bir metrik uzayı (X, d) tamdır (complete) eğer X alanındaki her Cauchy serisi (o
da X içinde olan) bir öğeye yaklaşıyor ise.
Üstteki tanımı önceki dersteki Cauchy tanımı ile birleştirirsek, R uzayının “tam”
olduğunu görebiliriz. Çünkü her Cauchy dizisinin R’de yakınlaştığını biliyoruz,
ayrıca bir bir reel sayıya yaklaşıldığını biliyoruz. Bu reel sayı L’in kendisi de zaten
4
R içinde olduğuna göre, R uzayı tamdır.
Inf ve Sup
Sup
Eğer S kümesi “yukarıdan sınırlanmış (bounded from above)” ise o zaman x ∈ S
için öyle bir y var demektir ki her x için x 6 y olsun. Yani S içindeki her değer bu
y değerinden küçük olsun. Bu x değerine S’in supremum’u da deniyor, ve sup(x)
x∈S
ya da sup{x : x ∈ S} olarak gösterilebiliyor.
Inf
Benzer şekilde kümenin en alt sınırı, yani infimum değeri inf (x) ya da inf{x : x ∈
x∈S
S} olarak gösteriliyor.
Eğer elimizde bir seri (sequence) var ise o zaman şartları biraz daha gevşetmek
iyidir, burada limit superior kavramı devreye girer. Inf ve sup değerleri altı /
üstü değer olamaz, ama limit superior öyle bir sayıdır ki onun sonrasında sonlu
(finite) / belli sayıda küme öğesi olmasına izin verilir. Limit superior aslında bir
serinin yakınsadığı (converge) değerden başkası değildir.
Bu kavramların minimum ve maksimum kavramlarından farkı ne? Inf ve sup bir
küme dışında da olabilirler. Bir kümenin minimal değeri muhakkak o küme içinde
olmalı ama öyle kümeler vardır ki minimal ya da maksimal değeri yoktur. Mesela
R+ yani sıfır hariç tüm pozitif reel sayıları düşünelim: minimumu nedir? Hangi
“çok küçük” değeri alırsak alalım, o değeri iki ile bölerek daha küçük bir değer
elde edebilirim, yani minimum yoktur. Fakat bu kümenin bir infimumu vardır,
sıfır değeri. Sıfır bu küme içinde değildir ama kümeyi sınırlayan bir değerdir.
Benzer örnek ters yönden supremum için de geçerli.
Formel olarak diyelim ki {xn } bir seri, ve diyelim ki bir reel sayı S var, ki bu reel
sayı şu şartları tatmin ediyor 1) Her > 0 için bir N var, öyle ki her n > N için
xn < S + ve 2) her > 0 ve M > 0 için bir n > M var ki xn > S − . O zaman S
sayısına {xn } serisinin limit superior’u denir.
Bu tanımın söylemeye çalıştığı serinin yaklaştığı değerden sonra ve önce sonlu
büyüklükte bir pencere tanımlarsak bu pencere içinde sonlu sayıda eleman ola-
5
caktır (sonsuz değil). Bu pencerenin tanımlanabiliyor olması, onun makul bir
noktada olmasını gerektirir, ki bu nokta da yaklaşılan değerden başkası değildir.
Limit inferior bunun tersidir,
Vektör Uzayları
Her vektör uzayıyla ilintili olan bir tek sayı / skalar (scalar) kümesi vardır, ve bu
büyüklükler ile o uzayda çarpım işlemi tanımlanır. Soyut bağlamda çalışılanlar
için bu büyüklüklerin cebirsel bir alan (algebraiç field -bir soyut matematik kavramı-
) üyesi olması yeterlidir. Fakat bu notlarda kullanacağımız büyüklükler ya reel
sayılar, ya da kompleks sayılar olacak. Bu iki olasılık arasında hangisini kul-
landığımızı belli etmek için vektör uzayına “reel vektör uzayı” ya da “kompleks
vektörü uzayı” diyebiliriz. Odağımız ise çoğunlukla reel vektör uzayları ola-
cak, kompleks olanları nadir kullanacağız. Yani eğer uzayın şekli söylenmemişse,
onun reel olduğunu farz edin.
Tanım
Vektör uzayı X, “vektör” denen öğeleri içeren bir küme, artı iki operasyondan
oluşur. İlk operasyon toplama, diğeri çarpmadır. Toplama işlemi iki vektör x, y ∈
X’i bir diğer vektör x + y ∈ X ile bağdaştırır. Çarpma işlemi x ∈ X ve herhangi bir
sayı, skalar α ile vektör αx’i bağdaştırır.
θ sıfır vektörüdür.
0 x = θ, 1 x = x
6
Ders 3
Örnek
Bir önceki örneğin doğal bir uzantısı n-boyutlu reel kordinat uzayı olabilir. Bu
uzaydaki vektörler n-öğeli içinde n tane reel sayı olan bir dizidirler, ve vektörler
x = (ξ1 , ξ2 , ..., ξn ) formundadırlar. Reel tek sayı ξk ’ye vektörün k’inci elemanı
adı verilir. İki vektör, eğer tüm öğeleri birbirine eşit ise, eşittir. Sıfır vektörü
θ = (0, 0, ..., 0) şeklinde tanımlıdır.
n boyutlu reel kordinat uzayı Rn olarak tanımlanır. Buna tekabül eden n-öğeli
kompleks sayıların uzayı Cn ’dir.
Bu noktada aslında boyut kavramını devreye sokmak için biraz erken. Daha
ileriki derslerde boyut kavramının detaylı tanımı yapılacak, ve bu bahsettiğimiz
uzayların hakikaten n-boyutlu olduğu ispatlanacak.
Örnek
Sonsuz sayıda eleman, sonsuz öğeli dizi içeren vektörlerlerle ilginç bazı uzay-
lar inşa edilebiliyor, ki bu uzayda tipik bir vektör vektörler x = (ξ1 , ξ2 , ..., ξk , ...)
şeklinde oluyor. Diğer bir şekliyle x = {ξk }∞ k=1 . Toplama ve çıkartma önceden
olduğu gibi teker teker, sırası birbirine uyan öğeler arasında yapılıyor. Reel sayılardan
oluşan her türlü sonsuz dizilerin listesi bir vektör uzayı oluşturuyor. Bir dizi
{ξk }’ye sınırlı (bounded) denir, eğer her k için |ξk | < M olacak şekilde bir M
sabiti var ise. Sonsuz ve sınırlı (tanımını biraz önce yaptık) olan her dizi bir
vektör uzayı oluşturur, çünkü iki sınırlı dizinin birleşimi, ya da dizinin sayısal
çarpımı yine bir sınırlı dizi olacaktır.
Örnek
İçinde sonlu / belirli (finite) miktarda sıfıra eşit olmayan öğe içeren tüm dizilerin
birleşimi bir vektör uzayıdır (her vektör -dizi- içinde farklı miktarda sıfır olmayan
öğe olabilir). Bu uzaya sonlu sayıda sıfırı olmayan dizilerin uzayı ismi verilir.
Örnek
Sonsuz tane reel sayıdan oluşan ve hepsi de sıfıra yaklaşan dizilerin birleşimi bir
vektör uzayıdır, çünkü bu tür sıfıra yaklaşan iki dizinin toplamı da aynı şekilde
sıfıra yaklaşır. Böyle bir dizinin skalar ile ’çarpımı, yani katı yine sıfıra yaklaşır.
Örnek
Reel çizgi üzerinde bir [a, b] aralığı düşünün. Bu aralık üzerinde tanımlı tüm
sürekli fonksiyonlar bir vektör uzayı oluşturur. İki vektör x, y daha detaylı olarak
x(t), y(t) olarak kullanılıyor, ki t ∈ [a, b]. Eğer x = y ise x(t) = y(t) demektir.
(x + y)(t) = x(t) + y(t) ve (αx)(t) = αx(t) kullanılır. Sıfır vektörü θ bu aralıkta
sürekli sıfır değerinde olan vektördür. Bu uzaya [a,b] arasında reel değerli sürekli
fonksiyonlar uzayı denir.
[a, b] aralığında tanımlı tüm sürekli fonksiyonların vektör uzayı oluşturması mantıklı
değil mi? Çünkü bir fonksiyon verilen bir değer için bir başka değer üretmez mi?
1
O zaman bu değerleri [a, b] aralığına tekabül eder şekilde yanyana düşünürsek,
onlar da bir tür dizin oluştururlar. Dizinin içeriği tabii ki fonksiyonun ne olduğuna
göre değişecektir, ama içerik sonuçta belli bir sayı dizisidir. Ve tüm bu farklı
dizinleri düşünürsek, onlar bir vektör uzayı oluşturabilirler. Ayrıca tüm sürekli
fonksiyonlardan bahsediliyor, bu neredeyse tüm reel sayı dizileri demek gibi
bir şey, çünkü [a, b] aralığındaki her türlü fonksiyon uzaya dahil edilmiş. Her
türlü kıvrılan, bükülen, artan, azalan fonksiyonu düşünelim, bunların tamamı
muhakkak bir vektör uzayı tanımlayabilirler.
Şimdi birkaç vektör uzayını birleştirerek nasıl daha büyük bir tane yaratabileceğimizi
görelim.
Tanım
X, Y’nin aynı skalar alanı üzerinden tanımlı iki vektör uzayı olduğunu düşünelim.
X, Y’nin kartezyen çarpımı, ki bu X × Y olarak gösterilir, iki öğeli sıralanmış bir
dizi oluşturacaktır, yani (x, y), ki x ∈ X, y ∈ Y. X × Y üzerinde toplama ve skalar
çarpım (x1 , y1 ) + (x2 , y2 ) = (x1 + x2 , y1 + y2 ) ve α(x1 , y1 ) = (αx1 , αy1 ).
Üstteki tanımın bir vektör uzayı olmanın gerekliliklerini yerine getirdiği ortadadır.
Hatta bu tanım kolaylıkla n tane vektör uzayının kartezyen çarpımına genişletilebilir,
yani X1 , X2 , .., Xn . Bu çarpımı temsil etmek için Xn yazacağız.
Alt Uzaylar (Subspaces), Lineer Kombinasyonlar, ve Lineer Çeşitler (Linear Vari-
eties)
Tanım
M, X’in boş olmayan bir alt uzayıdır (subspace) eğer αx + βy formundaki her
vektör M içinde ise, ve x, y ∈ M olmak üzere.
Hiçbir alt uzayın boş olmadığını baştan kabul ettiğimize göre, içinde en az bir
x olmalıdır. Tanım itibariyle ayrıca 0x = θ’yi da içermelidir, o zaman her alt
uzay sıfır vektörünü de içerir. En basit alt uzay içinde sadece θ olan alt uzaydır.
Üç boyutlu uzayda orijinden geçen bir düzlem bir alt uzay oluşturur, orijinden
geçen bir çizgi aynı şekilde bir alt uzay oluşturur.
X’in tamamı da X’in (yani kendisinin) bir alt uzayıdır. Tüm uzaya eşit olmayan
bir alt uzaya düzgün (proper) alt uzay denir.
Her alt uzay kendi öğelerinin toplamlarını, ve katlarını içerdiği için aynı anda
bir uzayı tanımlayan 7 gerekliliği (axiom) otomatik olarak yerine getirmiş olur.
Zaten alt uzay derken “uzak” kelimesini kullanabilmemizin sebebi budur.
Diyelim ki X uzayı n öğeli dizinlerin (tuple) birleşimi. Bu dizinlerin bir kopyasını
düşünelim, tek farkla, 1. öğenin hep sıfır olsun. Bu bir alt uzaydır. 1/2 noktasında
sıfır olan [0, 1] üzerinde tanımlı sürekli fonksiyonlar, tüm sürekli fonksiyonların
bir alt uzayıdır.
İki alt uzayın evliliği (union, ∪ ile gösterilen) bir alt uzay olmayabilir. Bir düzlem
üzerinde mesela, aynı yönde gitmeyen (noncolinear) iki çizginin evliliği, bu iki
2
ayrı çizginin rasgele toplamlarını içermediği için alt uzay olma şartını yerine ge-
tirmez. Fakat “kümelerin toplamı” kavramından hareketle, iki alt uzay daha
büyük bir alt uzay olarak özel bir şekilde birleştirilebilir.
Tanım
Bir vektör uzayının S, T adlı iki alt kümesinin toplamı S + T olarak gösterilir, ve
her s + t formundaki tüm vektörleri içerir, ki s ∈ S, t ∈ T olmak üzere. Dikkat,
daha S, T ’nin alt uzay olduğunu söylemiyoruz, sadece küme diyoruz (şimdilik).
Üstteki resim toplam kavramını iki boyutlu uzayda (ki bu bir vektör uzayıdır)
gösteriyor. Vektör uzayı, S, T içindeki noktalara doğru işaret eden orijinden çıkan
iki vektörü görüyoruz. Toplam olarak, hakikaten S’teki noktanın / vektörün
mesela (3,1) olduğunu düşünsek, T ’deki noktanın / vektörün (1,3) olduğunu
düşünsek, onların toplamı olarak gösterilen nokta kabaca (4,4) gibi duruyor değil
mi? Şekil bu kavramı temsili olarak iyi göstermiş. Toplamın ayrıca daha büyük
bir küme olduğuna dikkat.
Teori
Diyelim ki M, N vektör uzayları X’in birer alt kümesi. O zaman bu kümelerin
toplamı M + N aynı şekilde X’in bir alt uzayıdır.
İspat
M + N’nin θ’yi içerdiği bariz. Devam edelim, x, y ∈ S + T için muhakkak
x = m1 + n1
y = m2 + n2
αx = αm1 + αn1
3
βy = βm2 + βn2
Çarpımları toplayalım
4
Ders 4
Dışbükeylik (Convexity) ve Koniler (Cones)
Bir lineer vektör uzayındaki K kümesi dişbukeydir (convex), eğer x1 , x2 ∈ K için
αx1 + (1 − α)x2 , 0 6 α 6 1 formundaki tüm noktalar da K içinde ise.
Matematiksel olarak α, 1 − α ile yapılmaya uğraşılan x1 , x2 “arasındaki” bir nok-
tayı temsil etmek. Eğer 0 6 α 6 1 ise, x1 , x2 ’yi sırasıyla α, 1 − α ile çarpıp
sonuçları toplamak “biraz x1 ’den, biraz x2 ’den almak” anlamına geliyor, bu da
tanım itibariyle her zaman x1 , x2 arasında bir yerde olmaktır. α 0 ile 1 arasındadır,
yani bir nevi yüzde hesabı yapılıyor, 0.2 oradan, 0.8 şuradan alınıyor. Hesabın bir
tür yüzde hesabı olması sebebiyle iki nokta arasında kalınması garanti edilmiş
oluyor.
Ve eğer bu “arada olmak” denklemi, kümedeki her noktanın her diğer noktayla
arasındaki, yani her α için hesaplanacak noktalar için de doğru ise, o zaman
hep aynı kümedeyi, “dışarı çıkmıyoruz” demektir ve bu dişbukeyliğin tanımıdır.
Görsel olarak ta kabaca bunu görmek mümkündür, dişbukey bir cisimde bir nok-
tadan diğerine düz çizgide giderken hep cisim içinde kalırız.
Teori
K, G bir vektör uzayında dışbükey olan iki küme olsun. O zaman
1) αK = {x : x = αk, k ∈ K} her α için dışbükeydir.
2) K + G dışbükeydir.
İspatlamadan bunun daha genel bir hali olan başka bir teoriye bakalım, onu is-
patlarsak üsttekini de ispatlamış olacağız.
Teori
C , içindeki tüm kümeleri dışbükey olan rasgele bir buket olsun. O zaman ∩K∈C K
aynı şekilde dişbukeydir.
Ispat
Diyelim ki C = ∩K∈C K. Eğer C boş ise, teori hemen ispatlamıştır. Diğer şartlar
için, farzedelim ki x1 , x2 ∈ C. O zaman x1 , x2 ∈ K demektir, çünkü C bir kesişim,
yani tüm K ∈ C içindeki aynı olan öğelerden müteşekkil. Her K’nin kendi başına
dışbükey olduğunu bildiğimize göre, o zaman C de dışbükey demektir.
1
Fonksiyonlarda Norm, İçsel Çarpım (Dot Product)
Bu kavramları lineer cebirde pek çok kez duyuyoruz. Mesela iki vektör a, b için
onların içsel çarpımı a · b, her iki vektörün tekabül eden öğelerinin çarpımı ve bu
sonuçların toplamı demektir. a = [a1 , a2 , ..] ve b = [b1 , b2 , ...] ise içsel çarpım,
X
N
a·b= ai b i
i=1
İç çarpımın sürekli ortamda olan fonksiyonlar için de bir karşılığı var. Eğer bir
vektörü bir fonksiyonun belli aralıklardan seçilmiş ayrıksal değerleri içeren bir
şey olarak düşünürsek, fonksiyon bir anlamda sonsuz değerdeki bir vektördür.
O zaman, elimizde f(x) ve g(x) var diyelim, bu “sonsuz vektörlerin” tekabül
eden değerlerinin çarpılıp toplanması nasıl yapılır? Entegral ile! O zaman f, g
arasındaki içsel çarpım [1, sf. 183],
Zb
f(x)g(x) dx
a
Zb
||f|| =
2
(f(x))2 dx
a
Z 2π
||f|| =
2
(sin x)2 dx = π
0
Vektör dikgenliği ile fonksiyon dikgenliği yine aynı altyapıyı kullanacak, iki vektörün
dik olup olmadığını a · b sonucunun sıfır olup olmadığı ile anlayabiliyorduk.
Fonksiyon dikgenliği için entegral bazlı içsel çarpımı kullanacağız, mesela cos x
ile sin x dik midir?
Z 2π
sin x cos x dx = 0
0
2
Norm Edilmiş Lineer Uzaylar
Soyut Analiz ve uygulamalarda ilgilenilen vektör uzaylarının 7 önşarttan daha
fazlasına ihtiyacı vardır. 7 önşart vektör uzaylarının sadece cebirsel özelliklerini
tanımlar: toplam, skalar çarpım, ve bunların değişik kombinasyonları. Eksik
olanlar topolojik olan özelliklerdir, yani açıklık (openness), kapalılık (closure),
yakınsaklık (convergence), ve bütünlük (completeness). Eğer uzayın içinde uzaklık
ölçümü tanımlanır ise, bu kavramlar kullanılabilir.
Tanım
Norm edilmiş bir lineer uzay X adındaki bir vektör uzayıdır, ki X içindeki her x
öğesini bir reel sayı ||x||’e eşleyen bir fonksiyon vardır, ve ||x||’e x’in norm’ü adı
verilir. Norm şu önşartları yerine getirmelidir.
1) ||x|| > 0, her x ∈ X için, ve ||x|| = 0, sadece ve sadece x = θ ise.
2) ||x + y|| 6 ||x|| + ||y|| her x, y ∈ X için (üçgensel eşitsizlik)
3) ||αx|| = |α| ||x||, her skalar α ve her x ∈ X için.
Norm kavramı uzaklık kavramının soyutlaştırılmış bir halinden ibaret aslında.
Reel analizdeki üçgensel eşitsizliğin karşılığı burada da görülüyor mesela. Neyse,
devam edelim, üstteki üçgensel eşitsizlik kuralının bir uzantısı / sonucu (lemma)
şu:
Teori
Norm edilmiş bir lineer uzayda
İspat
Üstte adece ||x|| içine −y + y ekliyoruz, yani aslında hiçbir şey değiştirmedik.
Şimdi eşitliğin sağındaki ilk terimi alıp ona üçgensel eşitliği uygularsak (norm
içindeki + işareti solu ve sağındaki grupları ayrı terimler olarak kabul etmemiz
gerekir)
3
Uygun bir norm bulunabilirse, daha önce gösterdiğimiz vektör uzayı örneklerinin
çoğunluğu norm edilebilen uzaya dönüştürülebilir.
Örnek 1
C[a, b] adı verilen norm edilmiş uzay, [a, b] reel aralığı, artı norm
tanımından oluşur. Hatırlarsak bu uzay daha önce bir vektör uzayı olarak gösterilmişti.
Norm [a, b] aralığına bakıyor, her x(t) için mutlak değeri (absolute value) en
yüksek olan değeri alıp onu norm değeri ilan ediyor. Fonksiyon bir parabol ise,
parabolun tepe noktası o fonksiyon için norm kabul edilecek.
Şimdi teklif edilen norm’un 3 gerekli önşartı yerine getirip getirmediğine bakalım.
Bariz ki ||x|| > 0 çünkü norm kesin değer kullandık ve kesin değerler hep sıfırdan
büyük, ayrıca ||x|| sıfır olması için x(t)’nin her yerde sıfır olması lazım, fonksiyon
tek bir noktada sıfırdan azıcık daha büyük olsaydı, max hemen onu norm kabul
ederdi. Üçgensel eşitsizlik alttaki ilişkinin bir uzantısı zaten
Örnek
[a, b] aralığında tanımlı tüm sürekli fonksiyonların uzayı alttaki norm üzerinden
bir norm edilmiş uzaydır
Zb
||x|| = |x(t)| dt
a
4
Çoğu zaman, istenen bir özelliğe sahip olan bir vektörün varlığını ispat ederken
belli bir limite yaklaşan bir vektör dizisi yaratmak yaygın bir tekniktir. Çoğu za-
man bu limitin istenen özelliğe sahip olduğu gösterilebilir. Bu sebeple yakınsaklık
kavramı Analizde çok önemli rol oynayan bir kavramdır.
Tanım
Norm edilmiş bir lineer uzayda sonsuz sayıda vektör içeren bir dizi {xn }’in x’e
yaklaştığı söylenir eğer {||xn − x||} reel sayılar dizisi sıfıra yaklaşıyorsa. Bu du-
rumda xn → x diyebiliriz.
Eğer xn → x, ||xn || → ||x|| olmalı, çünkü (1)’e göre
O zaman
||x|| − ||xn || 6 ||x − xn || → 0
olmalıdır.
Teori
Eğer bir dizi yaklaşıyorsa, limiti özgündür (unique).
İspat
Diyelim ki xn → x ve xn → y, yani xn apayrı iki limite yaklaşıyor (gibi) bir şey
ortaya attık. Peki o zaman ||x − y|| ne olur? Göreceğiz ki bu norm sıfıra gidecek
ve bu sebeple x, y’nin birbirinden farklı olamayacağını anlamış olacağız.
Üstte yine aynı numarayı kullandık, −xn +xn ekleyerek eşitlikte hiçbir şey değiştirmiyoruz,
ama daha fazla terim elde ederek şimdi üçgensel eşitsizliği kullanabileceğiz. +
işaretinin solundaki ve sağındaki blokları ayrı terimler gibi kabul edersek,
ve
||x − xn || → 0
5
||xn − y|| → 0
olduğuna göre
||x − y|| → 0
Kaynaklar
[1] Strang, Lineer Algebra and Its Applications
6
Ders 5
Teori
Bir küme F kapalıdır (closed), eğer F içindeki her yakınsayan dizinin limiti yine F
içindeyse [ispat atlandı].
Tanım
Vektörü uzayı X’ten reel (ya da kompleks) skalar uzayına yapılan transformasy-
ona X üzerinde tanımlı bir fonksiyonel denir.
Dikkat fonksiyon değil, fonksiyonel. Fonksiyonelleri diğer daha genel trans-
formasyonlardan ayırtetmek için onlara notasyon olarak küçük harfler verilir,
mesela f, g gibi.
Norm edilmiş uzayda f(x) = ||x|| bir fonksiyonel örneğidir. Yani norm operatörünün
kendisi de bir fonksiyoneldir. Reel değerli fonksiyoneller optimizasyon teorisi
açısından çok önemlidir normal olarak çünkü optimizasyonun amacı bir fonksiy-
oneli minimize (ya da maksimize) edecek bir vektörü bulmaktır.
lp ve Lp Uzayları
Şimdi derslerin geri kalanında çok kullanacağımız, faydalı olacak bazı klasik
norm edilmiş uzayları görelim.
Tanım
0 < p < ∞ olacak şekilde p bir reel sayı olsun. lp uzayı {ξ1 , ξ2 , ...ξn } skalar
dizisidir, ki bu dizi şu şarta uymalıdır,
X
∞
|ξi |p < ∞
i=1
p sayısı tanımlanan uzaya göre değişir, yani l3 olabilir, bir diğeri l5 , vs. Bu uzayın
normu nedir? Dikkat, üstteki bir norm değil, uzayı tanımlamak için kullandığımız
şartlardan biri. Norm,
X
∞ 1/p
||x||p = |ξi |
p
i=1
1
Banach Uzayları
Tanım
Bir norm edilmiş uzayda {xn } dizisine Cauchy dizisi denmesinin şartı şudur: Eğer
m, n → ∞ iken ||xn − xm || → 0 doğru olmalıdır; mesela verilen > 0 için öyle bir
N olmalıdır ki, her n, m > N için ||xn − xm || < doğru olmalıdır.
Bir norm edilmiş uzayda her yaklaşan dizi Cauchy dizisidir. Eğer xn → x ise, o
zaman
Fakat bu kuralın tersi her zaman doğru olmayabilir, yani her Cauchy dizisi yaklaşıksal
olmayabilir.
İçinde her Cauchy dizisinin yakınsayan olduğu norm edilmiş uzaylar analizde
özellikle ilgi görür, önemlidir, çünkü bu tür uzaylarda yaklaşıksal dizileri bulmak
/ göstermek için onların limitlerini bulmak gerekmez (sadece Cauchy olduklarını
göstermek yeter). Bu tür norm edilmiş uzaylara tam (complete) uzaylar denir.
Tanım
Norm edilmiş uzay X içindeki her Cauchy dizisinin X içinde bir limiti var ise, bu
uzaya tam denir. Tam olan bir norm edilmiş uzaya Banach Uzayı ismi verilir.
Uygulamalarda önümüze çıkan problemleri Banach uzayına olan yansımasını /
orada da aynen işleyecek bir versiyonunu / eşdeğerini yaratmak için oldukça
çaba sarfederiz. Bu problemleri diğer, çoğunlukla tam olmayan, uzaylardan çıkartmak
için çok uğraşırız, çünkü optimizasyon problemlerinde Banach uzaylarının bir
avantajı vardır; hedef fonsiyonunu maksimize edecek optimal vektörü bulmak
için çoğunlukla bir vektör dizisi yaratırız, ve bu dizideki her eleman bir öncekinden
daha iyi olur, ve o zaman aradığımız optimal vektör otomatik olarak bu dizinin
limiti olacaktır. Bu tekniğin ise yaraması için limiti hesaplayamıyor olsak bile, bu
dizinin yaklaştığını bir şekilde bilmemiz gerekir / bunu bize gösterecek bir test
gerekir. Yakınsaklık için Cauchy kriteri işte bunu sağlar, temel aldığımız uzay
tam ise, Cauchy dizisinin yaklaşacağından emin olabiliriz.
Şimdi tam olmayan bir norm edilmiş uzay görelim.
Örnek
X uzayı [0, 1] üzerinde tanımlı tüm sürekli fonsiyonlar olsun, ve norm kxk =
R1
0 |x(t)| dt. X’in tam olmadığını ispat için X içinde şöyle bir dizi yaratacağız,
2
1 1
0 06t6 −
2 n
n 1 1 1
xn (t) = nt − +1 − 6t6
2 2 n 2
1
1 t> 2
Bu dizinin her elemanı bir sürekli fonsiyondur ve bu yüzden X’in bir üyesidir.
1 1 1 1 1 1 11
· 1 · ( − am ) − · 1 · ( − an ) = −
2 2 2 2 2m 2n
Yani
3
1
||xn − xm || = |1/n − 1/m|
2
Örnek
C[0, 1] bir Banach uzayıdır. Daha önce bu uzayın tam olduğunu söylemiştik.
C[0, 1]’in tam olduğunu ispatlamak için C[0, 1] içindeki her Cauchy dizisinin bir
limiti olduğunu göstermek yeterlidir.
Diyelim ki {xn } C[0, 1] içinde bir Cauchy dizisi. Her sabit t ∈ [0, 1] için |xn (t) −
xm (t)| 6 ||xn − xm || → 0, o zaman {xn (t)} reel sayılardan oluşan bir Cauchy dizi-
sidir. Bu dizi doğal olarak reel sayılar uzayı R’dedir, ve R’nin tam olduğunu biliy-
oruz. O zaman bu dizinin yaklaştığı bir x(t) her zaman olacaktır, yani xn (t) →
x(t). Bunun sonucu olarak xn fonksiyonları da x’e yaklaşmalıdır.
Genel olarak tarif etmek gerekirse, xn dizisini R’deki bir başka dizi {xn (t)}’ye in-
dirgiyoruz, yani yansımasını yaratıyoruz, seçtiğimiz tek bir t üzerinden. Uzayı
değiştirmemizin avantajı şu, R’nin tam olduğunu biliyoruz. O zaman oraya in-
dirgediğimiz Cauchy dizisinin o uzayda muhakkak bir limiti olmalıdır. Şimdi,
R’den filmi geriye sarıyoruz, her t için “yukarı çıkarken” elimizdeki limitleri
toparlıyoruz, ve xn seviyesine getiriyoruz. Bunu tüm t’ler için yapabildiğimize
göre, o zaman tüm xn ’nin de bir limiti olmalıdır.
4
Ders 6
Hilbert Uzayları
Giriş
Her lise geometri öğrencisi bir noktadan bir çizgiye olan en kısa mesafenin o
çizgiye dik olan ikinci bir çizgiden geçtiğini bilir. Kabaca da hemen görülebilecek
akla yatkın bu basit sonuç, noktadan düzleme olan mesafeler için de kolayca
genelleştirilebilir. Daha da ileri gidip n-boyutlu Öklit uzaylarına genellemek
gerekirse, bir noktadan bir altuzaya gidecek en kısa vektör o altuzaya dikgen
(orthogonal) olmalıdır. Bu arada, bu son sonuç en kuvvetli, önemli optimizasyon
prensiplerinin biri olan Yansıtma Teorisi’nin özel şartlarından biridir.
Bu gözlemde kritik püf nokta dikgenliktir. Dikgenlik kavramı genel olarak norm
edilmiş uzaylarda mevcut değildir, ama Hilbert Uzaylarında mevcuttur. Hilbert
Uzayı norm edilmiş uzayların özel bir halidir, norm edilmiş uzaylardaki özelliklere
ek olarak bir de içsel çarpım (inner product) işlemi tanımlar, bu işlem anali-
tik geometrideki iki vektörün noktasal çarpımına (dot product) eşdeğerdir, iki
vektörün içsel çarpımı sıfır ise o vektörlerin dikgen olduğu söylenebilir.
İçsel çarpım ile kuşanmış Hilbert Uzayları iki ve üç boyutlardaki geometrik buluşları
genellememizi sağlayacak yapısal bir cevher sağlar bize, sonuç olarak pek çok
analitik çözümün Hilbert Uzaylarında karşılığı vardır; Ortonormal bazlar, Fourier
Serileri, en az kareler minimizasyonu gibi kavramlarının hepsi Hilbert Uzayında
da kullanılabilirler.
Ön-Hilbert Uzayları (Pre-Hilbert Spaces)
Ön-Hilbert Uzayı bir lineer vektör uzayı X ile, X × X üzerinde tanımlanmış bir iç
çarpım işleminin beraberliğidir. Yani X’teki her elemanın bir diğeri (ve kendisi)
ile eşleşmesi üzerinde tanımlı bir iç çarpım işlemi vardır, ki bu işlem x, y ∈ X,
(x|y) olarak gösterilir, ve çarpımın sonucu bir skalar (mesela bir tek sayı) ola-
caktır.
(x|x) büyüklüğü ||x|| olarak gösterilir, norm operatörü tanıdık geldi herhalde,
p
zaten birazdan yapacağımız ilk işlerden biri bu büyüklüğün hakikaten bir norma
eşit olduğunu göstermek.
Önşartlar
1. (x|y) = (y|x)
2. (x + y|z) = (x|z) + (y|z)
3. (λx|y) = λ(x|y)
Cauchy-Schwarz Eşitsizliği
Bir iç çarpım uzayında (inner product space)r x, y için |(x|y)| 6 kxkkyk olmalı. Bu
küçüktür ya da eşittir ifadesindeki eşitlik kısmı sadece x = λy ise, ya da y = θ ise
doğru.
1
İspat
y = θ için eşitlik kısmı basitçe doğrulanabilir. O zaman diğer şartları kontrol
etmek için y 6= θ alalım. Bir skalar olan her λ değeri için
0 6 (x − λy|x − λy)
Belirlenen şartlara göre bu eşitsizlik doğru olmalı. Sadece doğru olduğunu bildiğimiz
bir ifadeyi yazdık o kadar. Bir nevi oltayı attık, bekliyoruz. Sonra üstteki ifadeye
2. önşartı uyguluyoruz
|(x|y)|2
6 (x|x) −
(y|y)
Ya da
2
Teori
Bir Ön-Hilbert uzayı X’te ||x|| =
p
(x|x) bir normdur.
İspat
Norm için tüm tanımlar zaten ortaya çıktı, tek eksik üçgensel eşitsizlik tanımı.
Herhangi bir x, y ∈ X için
= (x|x + y) + (y|x + y)
6 (||x|| + ||y||)2
Yani
Karekök alırsak
3
Tanım
Tam olan bir Ön-Hilbert uzayı Hilbert Uzayı olarak adlandırılır.
Hilbert Uzayı o zaman normu etkileyen / belirleyenbir iç çarpım işlemi tanımlamış
bir Banach uzayıdır. En , l2 , L2 [a, b] uzaylarının hepsi Hilbert uzaylarıdır. İç çarpımlar
bu arada altta gösterilen süreklilik özelliğine sahiptir.
Teori
İç Çarpımların Sürekliliği: Diyelim ki bir Ön-Hilbert uzayında xn → x ve yn → y.
O zaman (xn |yn ) → (x|y).
İspat
{xn } serisi yakınsayan olduğuna göre, sınırlı (bounded) olmak zorundadır; mesela
diyelim ki ||xn || 6 M. Şimdi,
hesabını yapalım. İfadenin içine (xn |y) artı ve eksi işaretleriyle koyalım,
Üstteki ilk ve son iki terimi gruplayalım, 2. önşartı tersten uyguluyoruz yani,
Üstteki mutlak değeri ortasından parçalayacağız. Ufak not, mutlak değer op-
erasyonu için de üçgensel eşitsizlik geçerlidir, yani
|a + b| 6 |a| + |b|
O zaman
4
Eşitsizliğin sağı sıfıra gidiyor, çünkü M sabit, ispatın başında xn → x ve yn → y
farzettik, o zaman üstteki farklar sıfıra gider.
5
Dışbükey Optimizasyonuna (Convex Optimization) Giriş
Yapay öğrenme (machine learning) ve optimizasyonda sürekli optimizasyonu
görürüz. Diğer disiplenlerde de görülür tabii ama bu ikisi benim ana konu-
larım o yüzden o konulardan bu derste daha fazla bahsedeceğiz. Derste be-
lirli bir amaç için gereken optimizasyon problemini çözmekten çok optimizasyon
mekanizmasının detaylarını inceleyeceğiz. Optimallik şartlarına bakmak, varılan
çözümün niteliğine bakmak bu detaylardan bazıları.
Şimdi aklınıza gelen bazı optimizasyon örneklerini verin bana [öğrenciler söylüyor]
1) Regresyon - En Az Kareler. Evet. Hata karelerinin toplamı minimize edilir
burada, bir hedef y vardır, onu bir formül üzerinden katsayıları olan bir denklem
vardır, ve model uyum iyiliğini hata kare toplamı üzerinden ölçeriz.
X
min (yi − xTi β)2
β
X
min (yi − xTi β)2 oyle ki
β
X
|β| 6 t
X
min |yi − xTi β|
β
BU tür regresyon ile aykırı (outlier) değerlere daha az önem verilmiş olur. Fakat
mutlak değer hesabı kullanınca optimizasyon zorlaşıyor çünkü üstteki formül
artık pürüzsüz değil.
4) Sınıflama - Lojistik Regresyon. LR ile yi ikisel olur, 0 ya da 1. LR formülizasyonu
normal regresyona benziyor,
5) Bilgisayar Bilim - Seyahet Eden Satış Görevlisi Problemi (TSP), Planlama, Ayrıksal
Optimizasyon. Bu ders bloklarının sonunda Tam Sayı Programlama (İnteğer
Programming) konusuna bakacağız, bu tür konulara orada daha çok yaklaşmış
olacağız.
6) İstastistik - Maksimum Olurluk. MO istatistikte pek çok yaptığımız işin mi-
henk taşıdır. Hatta LR, En Az Kareler, vs aslinda MO’nun özel, spesifik halleridir.
Burada vurgu içbükey olurluk elde etmek, ki bir içbükey fonksiyonu maksimize
etmiş olalım, bu bir dışbükey fonksiyonu minimize etmek ile aynı şey.
1
Böyle devam edebilirdik, optimizasyon örnekleri sayfalar doldurabilirdik. Opti-
mizasyon her yerde. Ama belki de neyin optimizasyon olmadığına da bakmak
iyi olur. Mesela istatistikte optimizasyon olmayan problemler nedir?
Hipotez test etmek, p-değerleri. Ya da takviyelemek (boosting), önemli bir konu
ama optimizasyon değil. Rasgele Ormanlar (Random Forests), değil. Önyükleyiciler
(bootstrap), çapraz-sağlama (cross-validation), yine değil [1, 22:09].
Ve iddiam şu ki optimizasyon olmayan konular hakkında olanlara kıyasla daha
fazla teorik bilgimiz var. Üstteki teknikler çoğunlukla prosedürsel. Ama mesela
Lasso diyelim, bu bir dışbükey optimizasyonun çıktısı olduğu için optimalite
şartları üzerinden onun çözümünün özellikleri hakkında konuşmak kolaylaşıyor.
Peki biz niye bu dersteki konuyu öğrenmek isteriz, isteyebiliriz? Sonuçta Lasso’yu
birisi bulmuş onun kodunu çağırırız, iş biter. Üç sebep var. Birincisi farklı algo-
ritmalar duruma göre daha iyi performans gösterebilir, durum derken veriden
bahsediyorum. Bu sebeple her algoritmanin özünü anlamak çok önemli. İkincisi
herhangi bir alandaki problemi çözen optimizasyonun temelini bilmek bize alan
hakkında ek görüş kazandırabilir.
Üçüncü sebep optimizasyon hızlı hareket eden bir alan, eğlenceli! Mesela opti-
mizasyon alanındaki NIPS Çalıştayına (Workshop) bakarsanız, her sene değişiyor!
Birkaç sene önce dışbükey olmayan optimizasyon büyük konuydu, tabii o zaman
bu dersi işlerken utanır gibi oluyorduk çünkü bizim konu dışbükey optimiza-
syon ve yapay öğrenimdeki en büyük konferansta dışbükey olmayan konular
işleniyor.. Fakat o zamanki odağın sebebi o zamanlarda bir sürü yeni dışbükey ol-
mayan ve yakınsadığı ispat edilen metotların bulunmuş olmasıydı. Ama bir son-
raki sene rasgele (stochastic) optimizasyon geri dönüş yapmıştı, rasgele gradyan
inişi vs. Böyle her sene değişim oluyor, bu güzel bir şey demek ki hala ilerleme
için oldukça alan var.
Ornekler
Bu orneklerin cogu tam varyasyon gurultu yoketmek (denoising) etrafinda, bunun
bir diger ismi kaynasmis (fused) lasso. Elimizde iki boyutlu izgara halinde bir
veri var, bir goruntu, i, j kordinatlarinda bir renk degeri var, 3 ile 7 arasindaki
renkler.
En soldaki gerçek resim. Ortadaki ise onun gürültülü hali, bizim elimizdeki veri
2
bu diyelim. Görüntüyü y vektörü olarak temil edeceğiz, bu tek boyutlu ama
düşünün ki görüntüdeki iki boyutu alıp düzleştirdik, tek vektör yaptık, alt alta
satır satırları yanyana koyduk mesela, vs. Bu resim hakkında şunu biliyoruz,
görüntü parçasal olarak sabit, yani yanyana hücreler birbirinden çok farklı değil.
Bazı yerlerde olabilir mesela mavi arka plandan kırmızı objeye geçiş yapılan yer-
lerde, ama diğer yerlerde benzerlik var. Biz gürültülü resimden gürültüsüz resmi
çıkartmak istiyoruz.
Gürültü yoketme alanında pek çok yöntem var. Fakat gürültü yoketme problem-
ine optimizasyon açısından yaklaşabiliriz. Mesela, hedef kriteri şu haldeki bir
optimizasyon problemi,
1X X
n
minn (yi − βi )2 + λ |βi − βj |
β∈R 2
i=1 (i,j)∈E)
İlk terimde aradığımız ideal resim ile gerçek resim arasındaki karesel kayıp hesabı
var, yani her hücredeki θi ’in olabildiği kadar yi verisine yakın olmasını istiyoruz.
İkinci terimdeki λ bizim dışarıdan atadığımız bir parametre, iki terim arasındaki
dengeyi kuruyor. Bu parametrenin çarptığı ikinci terim bir ceza terimi. Yanyana
olan her i, j’ye bakıyor, sağda solda altta üstte olsun, bu hücrelerin renk farkını
cezalandırıyor, yani farkın daha az olmasını zorluyor çünkü resimde genel olarak
bir süreklilik olmasını istiyoruz. Oldukça sofistike bir işlem aslında, ama opti-
mizasyon formülasyonu açısından oldukca basit. İki terim var, o kadar.
Çözüm resimde en sağdaki resimde görülüyor. λ = 25 seçtim onun için, ve
çözdüm. λ’yi arttırdıkça resmin daha kaba görüntülü olmaya başladığını görebilirdiniz,
mesela kırmızı ile pembe bölgeler birbiri içine geçmeye başlayabilirdi. λ = ∞
için ne olur? Her şey tek bir renk olur, o renk y’nin ortalaması olurdu. λ = 0 için
gürültülü verinin aynısını elde ederiz.
Çözümü nasıl elde ettim? Üstteki sonucu ADMM ile elde ettim. Bu ders bloğunun
sonunda bu algoritmayi göreceğiz. Bu problemde ADMM’in spesifik bir ver-
siyonunu kullandım, bu versiyonun bu problemde iyi işleyeceğini biliyordum.
300x200 boyutunda bir resimdi, 20 döngü sonrası sonucu elde ettim, her döngüde
lineer zaman harcadı. Tüm işleyişi bir saniyenin ufak bir parçasıydı.
Proksimal gradyan inişi ile 1000 kere döndük, sonuç fena değil ama bazı renkler
tam birleşmedi. Eğer 10000 kere döndürseydim ADMM sonucuna yaklaşırdı. Bu
metot ile de her döngüde lineer zaman harcanıyor, ama algoritmanın tamamı
daha yavaş yakınsadı. Yani, amaç için doğru araç diyemeyiz.
Sonra kordina iniş adında çok popüler bir diğer metot işlettim, 10000 kere döndü,
adımlar lineer zaman, ama yakınsama olmadı. Hatta sonuç oldukca kötüydü.
Kesinlikle amaç için yanlış araç. Yani iyi ile kötü metot arasında boyutsal fark
var (order of magnitude), işlem hızı bakımından 1, 2, daha kötü değil, 10, 100 kat
daha kötüden bahsediyoruz, ve kalite iyi değil.
Bu arada kordinat inişini öğrenince üstteki kriteri nasıl kullandığım kafa karıştırabilir,
3
cevap algoritmayi kriterin ikizi üzeride işlettim. Dersimizde ilerledikçe bunun
anlamını öğreneceğiz. Bir problemin ikizini almak ve bu ikize algoritmaları nasıl
uygulanacağını görmek.. bunları hep göreceğiz.
Mesajım ne? ADMM her yerde çok iyi işler demek mi? Hayır. ADMM bazı
yerlerde daha kötü işler. Diğer yerlerde proksimal gradyan daha iyidir. Bu se-
beple tüm seçenek yelpazesinin bilmek, her algoritmanin özelliklerini anlamak
faydalıdır.
Bir diger ornek [1, 42:53]. Tam varyasyon gurultu yoketme yapiliyor yine ama
burada iki boyuta bakmak yerine tek boyuta bakiyoruz, yani bazi acilardan bu
problem daha kolay. Veri yine y1 , .., yn ama duzlestirilmis goruntu yerine tek bir
eksende veri. Ayrica verinin ortalamasi parcasal sabit, yani tek duz cizgi.
1 X
n−1
2
min (yi − θi ) + λ |θi − θi+1 |
θ 2
i=1
Burada ceza teriminde yanyana olan iki θ’nin farkini cezalandiriyoruz, yani yanyana
verinin benzer olmasini istiyoruz.
Veriye bakarsak iki bolge var, bir bolgede ortalama sabit digerinde de (baska)
bir sabit. Ama algoritma bunu bilmiyor tabii onu kesfetmesi gerekecek. Eger λ
buyukse global ortalama ortaya cikiyor, tek cizgi. Goruntu orneginde soyledigimiz
oluyor yani ama tek boyutta. λ kuculdukce farkli ortalama bloklarinin ortaya
cikmasini sagliyoruz. Ortadaki sonuc oldukca iyi. 3. resimde λ biraz daha ku-
cultuldu, burada bakiyoruz algoritma basta ufak bir blok daha yaratmayi secti.
Bloklarin arasindaki noktaya “degisim noktasi (changepoints)” denir.
Bir değişim noktası elde edince, şimdi kendimize bir istatistiki soru sorabiliriz.
Bu değişim noktalarının istatistiki önemi (significance) nedir? Görsel olarak ben
bakınca diyorum ki 3. resimde sağdaki değişim noktası önemli ama o baştaki
ufak değişim değil. O yapma (spurious) bir değişim herhalde. Tabii λ’yi daha da
ufaltsam daha da fazla uyduruk değişim noktaları elde ederdim. Optimizasyon
probleminin özü böyle, ayar değişkeni λ elde edilen sonuçlara, neye ne kadar
ağırlık verildiğini kontrol ediyor. Fakat istatistiki öneme dönersek bu tür soruları
sadece tam varyasyonu iyi anladığımız takdirde cevaplandırabiliriz.
4
Çünkü istatistiki önem hesabı için mesela 1. blok ile 2. bloktaki noktaların orta-
lamasının farkına bakılır, ve bir Normal dağılım referans alınarak sıfır hipotezi
test edilir, ve bu hipotez neredeyse her seferinde rededilecektir (yani test bloklar
farklıdır diyor ama biz olmadığını görüyoruz). Niye böyle oldu? Çünkü opti-
mizasyonun kriterine bakarsak biz orada aktif olarak ortalama farkını fazlalaştırmaya
uğraşıyoruz. Ve tabii ki uğraştığımız şeyi test edince farklılık olduğunu buluy-
oruz. Bu doğru değil! Eğer optimizasyonun ne yaptığını bilmesek bu sonuca
varamazdık.
Devam edelim; Bu dersin merkezi kavramı dışbükeylik. Tarihsel olarak ilk başta
lineer programlar vardı, çok ciddi bir şekilde araştırıldı bu konu, koca dersler bu
konuya harcandı. O zamanlar düşünülüyordu ki lineer olan ve olmayan ayrımı
optimizasyonda en önemli ayrımdır. Bir tarafta çözebildiğimiz LP’ler var, diğer
tarafta daha zor, çözülmez LP olmayan problemler.
Ama sonradan anlaşıldı ki bazı LP olmayan problemler aslında o kadar çözülemez
değil. Mesela biraz önceki 1D lasso problemi LP değil ama çözülebiliyor. Ama
tabii bazı LP olmayan ve çok çetin problemler de var.. Devam eden araştırmayla
ortaya çıktı ki esas ayrım LP/olmayan değil, dışbükey / olmayan arasında. Çünkü
dışbükey problemler ve olmayan problemler çok çok farklı mahlukatlar. Dişbukey
problemlerde genel algoritmalardan bahsedebiliyoruz, bu algoritmalar bazı şartlarda
iyi, kötü işleyebilir ama hepsinin ispatlanabilir yakınsanabilirliği var. Elimizde
KKT optimallik şartları ve ikizlik gibi teorik araçlar var bu sayede dışbükeylikte
elde edilen sonuçların özelliğini anlamamıza yardım ediyor.
Teoriye giriş yapalım artık.
Dışbukey Kümeler ve Fonksiyonlar
Dışbukey küme C ⊆ Rn , öyle ki
5
x, y ∈ C ⇒ tx + (1 − t)y ∈ C, ∀0 6 t 6 1
Yani dışbükey küme C de seceğim herhangi iki nokta arasında çekeceğim düz
çizgi o küme içinde kalmalıdır [1, 1:00:24].
Üstteki diyor ki dışbükey fonksiyonun tanım kümesi, alanı dışbükey küme ol-
malı, ki Rn öyledir, ve bu fonksiyonu herhangi iki noktada hesaplayınca elde
ettiğim değer o iki nokta arasında çektiğim düz çizgi altında kalmalı.
Tipik problem
gi (x) 6 0, i = 1, .., m
hj (x) 6 0, j = 1, .., r
6
Formel şekilde, bir x noktası yerel minimumdur, eğer
doğru ise, yani alt noktadayım ve ρ büyüklüğünde bir top içinde olurlu değerler
üzerinden etrafa bakınca f(x)’den daha ufak bir değer görmüyorum.
Dişbukey problemlerde
y = tx + (1 − t)z, 06t61
60
hi (tx + (1 − t)z) = 0
çünkü h lineer.
Yani y olurlu, her kısıtlamaya uygun.
Ayrıca yeterince büyük (1’e yakın) t için
||x − y||2 6 ρ
7
demek istiyoruz ki x’den z’ye bir çizgi çekiyorum ve yeterince z’ye yakın bir
notkada ρ topunun dışına çıkmış oluyorum.
Güzel. Top içinde olurlu bir noktam var, tanım kümesi içinde, y de orada. f(y)
hakkında ne söyleyebilirim?
f(tx + (1 − t)z)
6 tf(x) + (1 − t)f(z)
Ve biliyorum ki f(z) < f(x), yani harfiyen küçüklük var, çünkü daha önce söylemiştik,
x global minimum değil, kriterler ışığında z ondan daha iyi. Ayrıca üstte “yeter-
ince büyük t” dedik, bunun için, topun dışına çıkıyoruz, z’ye yakınız ama tam z
değiliz. O zaman üstteki formül
< f(x)
olacaktır. Şimdi çelişkiye geldik, top içinde öyle bir y noktası bulduk bu nokta
harfiyen f(x)’den küçük ama bunu yapınca yerel minimum / optimumluk faraziyesini
ihlal etmiş olduk.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 7, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
8
Lineer Programlama ve Simplex
LP, Operasyonel Araştırma konusunun mihenk taşlarından biridir, ve bu alanda
George Dantzig simplex buluşu ile lineer optimizasyon alanında çığır açmıştır.
Lineer programlama ile çözülebilen problemlerde bir hedef fonksiyonu vardır,
tüm değişkenler artı değerdedir, ve sınırlama (constraint) ifadeleri vardır, bu
ifadeler a1 x1 + a2 x2 + ... + an xn 6 b şeklinde olurlar, ki b > 0 olacak şekilde.
Örnek
6000 akrelik (1 akre 0.4 hektara eşdeğer) bir tarlada ya mısır ya da soya ekebiliriz.
Mısırın her akresi için 9 galon (1 galon 3.78 litre) gübre, ve 3/4 saatlik işçilik
gerekli. Her akre soya için 3 galon gübre ve 1 saat işçilik gerekli. Çiftçinin elinde
40500 galonluk gübre, ve en fazla 5250 saatlik iş gücü var. Eğer mısır için galon
başına 60 lira, soya için 40 lira para kazanılıyorsa, tarlada ne kadar mısır ve soya
ekilmelidir ki kazanç maksimize edilsin [3, sf. 306]?
Eğer x mısır y soya miktarı ise,
x + y 6 6000
ifadesini
x + y + s1 = 6000
1
tanımlanabilir, ve bu değişkenin herhangi bir değere sahip olmasına izin verilir,
yeter ki x + y + s1 6000’e eşit olsun.
Küçüktür ya da eşittir ifadelerini böyle çevirebiliriz. Büyüktür ya da eşittir ifadeleri
için,
x+y>c
−x − y 6 −c
−x − y + s1 = −c
x + y − s1 = c
Yani büyüklük ifadelerini negatif pay bırakma değişkenleri ile eşitliğe çevirebiliriz.
Aynı şekilde diğer eşitsizlikleri değiştiririz, tabii her değişim için ayrı bir pay
bırakma değişkeni gerekir, s2 , s3 , .. böyle devam eder.
Hedef fonksiyonu da ufak bir değişim üzerinden aynı sınırlamalar listesine dahil
edilebilir, P = 60x + 40y hedefi −60x − 40y + P = 0 olarak değiştirilir.
Tüm denklem sistemi şöyle,
Çözümün genel stratejisi şudur: matris üzerinde satır bazlı değişim yaparak (ki
bu tür değişimlerin lineer denklem sisteminde değişiklik yaratmadığını biliy-
oruz) matrisin x, y değişkenlerinin olduğu bölgede sadece 1, 0 değerleri kalacak
hale getir. Ardından x, y çözümünü matrisin en sağ kolonundan oku.
Değişimleri yaparken tabii ki maksimizasyon amacına en hızlı erişecek şekilde
bu değişimleri yapmak isteriz.
2
En son satır hedef fonksiyonuna tekabül ediyor, ve amacımız maksimizasyon
olduğu için, maksimizasyona en hızlı şekilde erişmenin en iyi yolu en son satırda
değeri en küçük (en negatif) olan değeri değiştirmek. Bu kolonu pivot kolonu
olarak seçeriz.
Bu kolondaki hangi öğeyi seçeceğiz? Onun için o kolondaki her ögeyi matrisin en
sağındaki kolonda ona tekabül eden öğeye bölerek sonuca bakarız. Bu sonuçların
içinde hangisi daha küçük ise o hücre pivot ögesi haline gelir. Bu seçim, ve sebe-
pleri hakkında daha teorik detaylar [6, sf. 382]’da bulunabilir.
Pivot ögesi 9’u 1 haline getirmek ve o kolonda diğer tüm değerleri sıfırlamak için
satır operasyonları yaparız (Ri i’inci satır anlamında).
3
Böylece C matrisine eriştik. Amaçladığımız gibi x, y bölgesinde 1 ve 0 değerleri
var, bu noktada hedef fonksiyonun optimal değeri 315,000 (sağ alt köşe), ve y =
2250, x = 3750 bu optimal değer anındaki x, y değerleri. Demek ki çiftçinin tar-
lasının 3750 akresinde mısır, 2250 akresinde soya ekmesi onun için en kazançlısı
olacak.
Algoritma en alt satırda hiç negatif değer kalmayıncaya kadar devam eder.
Not: Her problem üstteki gibi acısız çözülemeyebilir; birden fazla, ya da hiç
çözüm olmadığı durumlar vardır, bu gibi farklı şartlar için [3]’e danışılabilir.
En iyisi tabii ki tüm bu hesapları ve şartları gözönüne alabilen bir optimizasyon
yazılımını kullanmak. Altta bunun örneğini göreceğiz.
Berlin’e Hava İkmali (Berlin Airlift)
Simplex, 2. Dünya Savaşı sırasında Berlin’e Hava İkmali adlı yardım operasy-
onunda yoğun bir şekilde kullanıldı. 24 Haziran 1948’te Sovyetler Birliği Doğu
Almanya’dan Berlin’e giden tüm kara ve deniz yollarını tıkadı. Bu yüzden Berlin’de
yaşayan 2 milyon insana yiyecek, giyim, vb. eşyaları nakil edebilmek için Amerikalı
ve İngiliz uçaklarından oluşan dev bir nakliyat operasyonu planlandı. Elde sınırlı
miktarda uçak, kargo kapasitesi vardı ve diğer bazı kısıtlamalar (constraints) da
göz önüne alınarak, durum bir lineer programa verildi ve optimal seferler plan-
landı. Simplex metodunun muciti George Dantzig bu problem üzerinde bizzat
uğraştı.
Bu problemin tam tanımı halen yayınlanmış değil, fakat esasına en yakın olan bir
örnek [5, sf. 20]’de bulunabilir. Bir diğeri, [4] baz alınarak, şöyle: Değişkenler 3
tip uçağın kaç tanesinin yiyecek ve kömür için kullanılacağı, yani 6 değişken var,
bunlar 1. tip uçak yiyecek için x1f , kömür için x1c diye gidiyor, diğerleri x2f , x2c ,
x3f , x3c .
Kısıtlamalar şöyle; 1500 tondan daha fazla yiyecek, 3500 tondan daha fazla kömür
lazım. 1. tip uçaktan en fazla 10 tane kullanabiliriz, 2. tipten en fazla 22 tane, 3.
tipten 10 tane.
Hedef fonksiyonu bir minimizasyon, bir masraf fonksiyonu bu, yani en az mas-
rafı olacak şekilde hedefe ulaşmak istiyoruz, hepsini bir arada gösterelim,
4
x1f + x1c 6 10
x2f + x2c 6 22
x3f + x3c 6 10
Basitleştirme amaçlı olarak x1f , x1c , .. yerine x1 , x2 , .. kullanalım, yani düz sayı
bazlı indisler olsun.
Bu problemde hem daha küçüktür, hem daha büyüktür türünden eşitsizliklerin
karışık şekilde kullanıldığını görüyoruz. Eşitsizliklerin hepsini pay bırakma değişkenleri
üzerinden eşitliklere çevireceğimiz için bu dert değil.
Bu problemi çözerken scipy.optimize adlı bir kütüphane çağrısı kullanacağız.
Bu çağrı minimizasyon yapar (yani maksimizasyon problemlerinin hedefi eksi
ile çarpılarak tersine çevirilmelidir) ve girdi olarak hem eşitsizlik, hem eşitlik
şartlarını alabilir, biz A_eq, b_eq parametreleri üzerinden ikincisini kullanacağız.
A = np.array([[-100.,0,-200.,0,-150.,0.,-1.,0,0,0,0],
[0,-100.,0,-200.,0,-150.,0,-1.,0,0,0],
[1.,1.,0,0,0,0,0,0,1.,0,0],
[0,0,1.,1.,0,0,0,0,0,1.,0],
[0,0,0,0,1.,1.,0,0,0,0,1.]])
print (res)
Optimization terminated successfully.
Current function value: -50000.000000
Iterations: 7
fun: -50000.0
message: 'Optimization terminated successfully.'
nit: 7
slack: array([], dtype=float64)
status: 0
success: True
x: array([ 0. , 10. , 7.5, 12.5, 0. , 0. , 0. ,
0. , 0. , 2. , 10. ])
Sonuç ilginç, 3. tip uçaktan hiç seçim yapılmamış. Bu mantıklı aslında çünkü
3. tip uçağın işletim masrafı 1.’den daha fazla ve bu uçaklardan elimizde 1. tip
kadar var.
Bir numara: pay bırakma değişkenlerinin ana matris içinde sadece köşegen üzerinde
değerlerinin olduğu dikkati çekmiş olabilir. Bu matrisi daha hızlı bir şekilde, ayrı
yaratıp soldaki diğer kısma eklesek kodlama daha hızlı olmaz mı? Evet; pay
bırakma değişkenlerini bir vektörde tutup bir birim matrisi ile çarparsak
5
svec = [-1,-1,1,1,1]
print np.eye(5,5) * svec
sağdaki kısmı elde ederiz. Şimdi soldaki kısma hstack ile “yapıştıralım”,
A = np.array([[-100.,0,-200.,0,-150.,0.],
[0,-100.,0,-200.,0,-150.],
[1.,1.,0,0,0,0],
[0,0,1.,1.,0,0],
[0,0,0,0,1.,1.]])
6
b = np.array([44., 512., 300000.])
c = np.array([30000., 20000., 0., 0., 0.])
res = linprog(-c, A_ub=A_ub, A_eq=A, b_eq=b, options={"disp": True})
print (res)
ekrana gelecek. Yani hesap (cost) adı verilen hedef fonksiyonu kargo büyüklüğünün
1080000.0 olduğu noktada maksimize oldu (haftada en fazla bu kadar kargo taşınabilecek),
ve bu optimal nokta için x = 20, y = 24 olmalı. Demek ki optimal bir Berlin ikmal
operasyonu için 20 Amerikalı, ve 24 İngiliz uçağı kullanmak gerekiyor.
Dantzig hakkında da ilginç hikayelerden biri: Doktorasını yaptığı sırada öğrenciyken
bir istatistik dersine geç girer. Hoca, tahtaya bazı problemler yazmıştır, Dantzig
bu problemleri ödev problemi olarak not eder. Ödevler Dantzig’i çok zorlar, an-
cak birkaç hafta sonra çözebilir, ödevleri hocasının masasına bırakır, ve olayı un-
utur. Fakat birkaç gün sonra hocasının heyecanla evine geldiğini görür, hocası
ona o problemlerin ödev sorusu değil, istatistikin en çetin, halen çözülememiş
problemlerinden ikisi olduğunu o zaman söyler! Yani Dantzig farkında olmadan
kısa zaman içinde aslında ciddi bir tez araştırması yapmıştır!
Bu hikayede ilginç psikolojik bir boyut var. Dantzig problemi “bir ödev olarak
verildiği için çözmesi beklendiğini” düşündüğü için mi çözmüştür? Belki de.
Bu hikaye Manuel Blum’un doktora hakkında söylediklerini çağrıştırıyor (bkz.
Doktora Derecesi yazısı).
7
Karesel Programlama (Quadratic Programming -QP-)
İçinde eşitsizlikleri de barındıran ve karesel olan bir matematiksel sistemi çözmek
için karesel programlama tekniklerini kullanabiliriz. Problemler şu şekilde ver-
ilir:
1 T
x Qx + pT x fonksiyonunu minimize et
2
Gx 6 h (eşitsizlik koşulu)
Ax = b (eşitlik koşulu)
Küçük harfli gösterilen değişkenler vektördür, büyük harfler ise bir matrisi temsil
ederler. x içinde diğer bilinmeyenler x1 , x2 , .. olarak vardır, bulmak istediğimiz
değerler buradadır.
Somut örnek olarak şuna bakalım:
koşullar:
x1 + x2 = 1 (eşitlik koşulu)
Fakat bu formül şu anda matris formunda değil. Matris formuna geçmek için
iki aşama var. Önce x değişkenlerinin birbiri ve kendileri ile çarpım durumlarını
halledelim. Öyle bir Q matrisi bulmalıyız ki, altta boş olan Q matrisinin değerleri
doldurulup, çarpım yapıldığında x değişkenlerinin tüm çarpım ilişkilerini bul-
sun. Çarpım ilişkileri nelerdir? Formülün 2x21 + x22 + x1 x2 kısmıdır.
.. .. x1
x1 x2
.. .. x2
8
(1,2) ve (2,1) ilginç çünkü ikisi de aslında x1 x2 ’i temsil ediyorlar çünkü x1 x2 =
x2 x1 . O zaman (1,2) ve (2,1) için 0.5 değeri verirsek, 0.5x1 x2 + 0.5x2 x1 ’i kısaltıp
x1 x2 haline getirebiliriz. Sonuç
2 0.5
Q=
0.5 1
Kontrol edelim:
2 0.5 x1
x1 x2
0.5 1 x2
x1
= 2x1 + 0.5x2 0.5x1 + x2
x2
= 2x21 + x1 x2 + x22
p vektörü ise, her terimin, tek başına ana formüle nasıl ekleneceğini kontrol ediyor.
T
Elimizde x1 +x2 olduğuna göre p = [1, 1] yeterli olacaktır, bakalım: 1 1 x1 x2 =
x1 + x2 .
Şimdi eşitsizlik koşulları. Bizden istenen x1 > 0 ve x2 > 0 şartlarını Gx 6 0
formunda temsil etmemiz. Burada önemli nokta matris formuna geçerken bir
yandan da > işaretini tersine döndürmemiz, yani 6 yapmamız. Bu çok dert değil,
değişkeni −1 ile çarparsak işareti tersine döndürebiliriz çünkü x1 6 0 ile −x1 > 0
aynıdır. O zaman Gx şöyle olacak:
−1 0 x1 0
6
0 −1 x2 0
−x1 0
6
−x2 0
Eşitlik koşulları
Eşitlik koşulları için problemimizin istediklerini
Ax = b formuna uydurmamız
lazım. x1 + x2 ’yi nasıl forma sokarız? A = 1 1 , b = 1 ile
x1
[1, 1] =1
x2
9
x1 + x2 = 1
CVXOPT
Bu paket ile karesel denklemleri minimizasyon / maksimizasyon bağlamında
çözmek mümkündür. Üstte bulduğumuz değerleri altta görebiliyoruz. Q eşitliğinde
2 ile çarpım var, bunun sebebi karesel denklem formunun başında 12 çarpımı ol-
ması, böylece bu iki çarpım birbirini dengeliyor.
10
Lineer Programlar, Örnekler
Bir lineer program (LP),
min cT x öyle ki
x
Dx 6 d
Ax = b
C = [[17,10,12],[9,8,10], [14,4,7]]
C = np.array(C)
print (C)
[[17 10 12]
[ 9 8 10]
[14 4 7]]
Önemli bir nokta her işin sadece bir kişiye verilmesi. Bunu mesela A için
1
Her isin tek kisiye verilmesi icin, mesela 1 icin
kısıtlaması, 2,3 için benzer şekilde halledilir. Tüm bu kısıtlamaları matris for-
munda vermek için, alttaki gibi bir matris yaratılabilir,
Notasyon x11 diyor bizim örnek için xA1 diye düşünülebilir. Bu matrisi LP çözümüne
Ax = b kısıtlaması olarak verebiliriz, Ax çarpımını takip edersek bu çarpımın
belli x’ler üzerinde toplama yaptığını görüyoruz, mesela ilk satır sol üst blok
xA1 + xB1 + xC1 toplamını yapıyor ve ona tekabül eden kısma b içinde 1 verirsek,
LP mekanizması bu kısıtlamaya göre gerisini halleder.
Kodda yapalım,
n = 3
X = np.zeros((2*n,n**2))
X[0,0:n] = np.ones((1,n))
X[1,n:n+n] = np.ones((1,n))
X[2,2*n:2*n+n] = np.ones((1,n))
X[3:6,0:3] = np.eye(n,n)
X[3:6,3:6] = np.eye(n,n)
X[3:6,6:9] = np.eye(n,n)
print (X)
[[1. 1. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 1. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 1. 1.]
[1. 0. 0. 1. 0. 0. 1. 0. 0.]
[0. 1. 0. 0. 1. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 1. 0. 0. 1.]]
print (C.flatten())
[17 10 12 9 8 10 14 4 7]
Şimdi LP çağrısı,
b = [1, 1, 1, 1, 1, 1]
2
res = linprog(C.flatten(), A_eq=X, b_eq=b)
res = np.round(res.x)
print (res)
[0. 0. 1. 1. 0. 0. 0. 1. 0.]
[2 0 1]
[0 1 2]
25
3
En Dik İniş (Steepest Descent)
Daha önce gradyan inişi konusunda işlediğimiz üzere bir f fonksiyonu için hesa-
planan −∇f(x) gradyanı x noktasında fonksiyon için en yüksek iniş (descent)
olacak yönü gösteriyordu [1, sf. 151]. Fakat dikkat, yön kelimesini kullandık,
o yönde ne kadar adım atılacağını belirtmedik. Gradyanın temel hesabı türeve
dayalı olduğu için ve türev hesapladığı noktaya yakın bir yerde doğru bir yaklaşıklama
olacağı için o yönde atılan adımın büyüklüğüne göre minimizasyon iyi ya da
kötü sonuçlar verebilir. Bu sebeple gradyan inişi algoritmaları, ki
xx+1 = xk + αk ∇f(xk )
ile kodlanırlar, çoğunlukla ufak ve pek çok adım atarlar, yani αk sabitleri ufak
seçilir. En Dik İniş (SD) algoritmasi bu noktada bir ilerleme. Her α, yani αk öyle
seçilir ki φ(α) ≡ f(xk − α∇f(xk )) kesinlikle minimize edilsin / belli bir yöndeki
en minimum noktaya vardıracak büyüklükte adım atılsın. Ya da
Yani gradyanın işaret ettiği yönde bir tür “arama” yapmış oluyoruz, adım büyüklüğünü
öyle seçiyoruz ki fonksiyon o yönde o kadar adım atıldığında en fazla inişi gerçekleştirmiş
olsun. Bu sebeple bu metota çizgi araması (line search) metotu deniyor.
Tabii arama derken akla ikinci bir döngü içinde yine ufak ufak adımlar atarak
çizgi üzerinde gelinen yere bakıp büyüklük hesabını böyle yapmak gelebilir, bu
sonuçsal olarak, kabaca doğru, ama asıl adım hesabı bazı cebirsel temellerle, ya
da onu çözen yaklaşıksal şekilde yapılıyor.
En basiti atılan adım α’yi pür cebirsel olarak çözmek, altta bir örnek [3, sf. 101].
Soru
f(x) = 9x21 + 4x1 x2 + 7x22 fonksiyonunun optimal noktasını bul.
Çözüm
Gradyanın öğeleri
∂f ∂f
∂x1
= 18x1 + 4x2 ve ∂x 2
= 4x1 + 14x2 . Şimdi SD yöntemini uygulayalım, başlangıç
noktası x = [ 1 1 ] olsun. Bu durumda f(x0 ) = 20, ve ∇f(x0 ) = [ 22 18 ]T .
0 T
x1 = x0 − α0 ∇f(x0 )
ya da
1
x1 1 22
= α0
x2 1 18
Şimdi öyle bir α0 seçmeliyiz ki f(x1 ) minimum olsun. Üstteki değerlerin bize
verdiği x1 ve x2 değerleri (ki α0 bazlı olacaklar) ana formüle yeni x olarak sokarsak,
αo bazlı bir denklem edeceğiz,
df(α0 )
dα0
= 0 üzerinden α0 ’nun optimum değeri 0.05’tır. Yani adımı şu şekilde at-
malıyız,
1 x1 1 22
x = = 0.05
x2 1 18
ki bu hesap bize f(x1 ) = 0.12 verir. Bu şekilde özyineli döngüye devam edersek
nihai optimum noktayı buluruz.
Sekant Yöntemi
Basit cebirsel numaralar ile üstte adımı bulduk. Daha çetrefil durumlar için sekant
yöntemini kullanabiliriz. Bu yöntemi [2]’de işledik, ayrıca bkz [1, sf. 120]. Sonuçta
aradığımız d yönündeki minimum
T
φk0 (α) = dk ∇f(xk + αdk )
T
0 = dk ∇f(xk + αdk )
dphi_curr=dphi_zero
2
i=0;
while np.abs(dphi_curr)>epsilon*np.abs(dphi_zero):
alpha_old=alpha_curr
alpha_curr=alpha
dphi_old=dphi_curr
dphi_curr=np.dot(np.array(grad(x+alpha_curr*d)).T,d)
alpha=(dphi_curr*alpha_old-dphi_old*alpha_curr)/(dphi_curr-dphi_old);
i += 1
if (i >= max) and (np.abs(dphi_curr)>epsilon*np.abs(dphi_zero)):
print('Line search terminating with number of iterations:')
print(i)
print(alpha)
break
return alpha
Örnek
f(x1 , x2 , x3 ) = (x1 − 4)4 + (x2 − 3)2 + 4(x3 + 5)4 fonksiyonunun minimize edicisini
bul.
T
Başlangıç noktamız 4 2 −1 olacak.
Üstteki fonksiyonun gradyanı
T
∇f(x) = 4(x1 − 4)3 2(x2 − 3) 16(x3 + 5)3
Kod olarak,
x1 hesaplamak için
Ama üstteki cebirle boğuşmaya gerek yok, gradyan fonksiyonu ve gidiş yönü
üzerinden kök bulup bize döndürecek üstteki çizgi araması kodunu kullanabili-
riz,
x0 = np.array([4,2,-1])
print (g(x0))
d0 = -g(x0)
alpha0 = linesearch_secant(g, d0, x0)
alpha0 = np.round(alpha0, 5)
3
print ('alpha0 =',alpha0)
x1 = x0 - alpha0*g(x0)
print ('x1',x1)
[ 0 -2 1024]
alpha0 = 0.00397
x1 [ 4. 2.00794 -5.06528]
print ('g1',g(x1))
d1 = -g(x1)
alpha1 = linesearch_secant(g, d1, x1)
print (alpha1)
x2 = x1 - alpha1*g(x1)
print ('x2',x2)
print ('\n')
print ('g2',g(x2))
d2 = -g(x2)
alpha3 = linesearch_secant(g, d2, x2)
print (alpha3)
x3 = x2 - alpha3*g(x2)
print ('x3',x3)
g1 [ 0. -1.98412 -0.00445103]
0.5000022675782785
x2 [ 4. 3.0000045 -5.06305448]
4
olabilir. Bir tanesi için = 100 iyidir, diğeri için belki = 0.001. Bu sebeple izafi
bir hesap daha faydalı olur, mesela
ya da
||xk+1 − xk ||
<
||xk ||
Üstteki yaklaşım “ölçekten bağımsız” olduğu için daha tercih edilir yaklaşım, bir
problemden diğerine geçtiğimizde farklı bir kullanmamız gerekmez.
Uygulama
Gradyan İnişi ve Model Uydurmak
Pek çok farklı probleme çözüm sağlayan bir teknik gradyan inişidir. Ne yazık ki
bilgisayar bilim lisans seviyesinde bu teknik genellikle öğretilmiyor. Bu yazıda
Gİ’nin hepimizin bildiği bir problemi, lineer regresyonu çözmek için nasıl kul-
lanılacağını anlatacağım [1].
Teorik seviyede Gİ bir fonksiyonu minimize etmeye yarar. Elde bazı parametreler
üzerinden tanımlı bir fonksiyon vardır, ve Gİ bir başlangıç değerinden başlayarak
azar azar o parametreleri değiştirerek fonksiyonun minimal olduğu yeri bulmaya
uğraşır. Bu azar azar, adım atılarak yapılan minimizasyon Calculus sayesindedir,
fonksiyonun gradyanının negatif yönünde adım atılarak mümkün olur. Bazen bu
matematiksel açıklamanın pratik kullanımı nasıl olur görmek zor oluyor; Örnek
olarak bir veriye lineer bir çizgi / model uyduralım.
Basit bir tanım yaparsak lineer regresyonun amacı eldeki bir veri kümesine düz
çizgi uydurmaktır. Veri alttaki gibi olabilir,
5
Üstteki veriyi düz çizgi olarak modellemek istiyoruz, bunun için lise matematiğinden
bilinen y = mx+b formülünü kullanacağız, m eğim (slope), b ise kesi (intercept),
yani y-ekseninin kesildiği yer. Veriye uyan en iyi çizgiyi bulmak demek en iyi
m, b değerlerini bulmak demek.
Bunu yapmanının standart yolu bir hata fonksiyonu tanımlamak (bazen bedel
fonksiyonu da deniyor). Hata fonksiyonu bir çizginin ne kadar “iyi” olduğunu
ölçebilen bir fonksiyondur, bir m, b çiftini alacak, veriye bakacak, ve bize uyu-
mun ne kadar iyi olduğunu bir hata değeri üzerinden raporlayacak. Hata değeri
hesabı için elimizdeki verideki tüm x, y değerlerine bakacağız, ve bunu yaparken
her veri y değeri ile, yine veri x’i üzerinden hesapladığımız mx+b değeri arasındaki
farka bakacağız; daha doğrusu farkın karesini alacağız, ve her veri noktası için
hesaplanan tüm bu kare hesaplarını toplayacağız. Kare alınıyor, çünkü bu hatayı
pozitif hale çevirmemizi sağlıyor, bir diğer fayda tabii kare fonksiyonun türevi
alınabilir olması (kıyasla mutlak değer fonksiyonu işleri daha karıştırırdı). Poz-
itif bir hata yeterli, çünkü hata yapılmışsa alttan mı üstten mi olduğu bizi il-
gilendirmiyor. Hata E hesabı şöyle,
Matematiksel olarak
1 X
N
E(m,b) = (yi − (mxi + b))2
N i=1
# y = mx + b
# m is slope, b is y-intercept
def compute_error_for_line_given_points(b, m, points):
totalError = 0
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
totalError += (y - (m * x + b)) ** 2
return totalError / float(len(points))
Veriye daha iyi uyan çizgiler (ki “daha iyi”nin ne olduğu hata fonksiyonumuz
üzerinden tanımlı) daha az hata değerleri anlamına gelecektir. O zaman, eğer
6
hata fonksiyonunu minimize edersek, veriye uyan iyi çizgiyi bulacağız demektir.
Hata fonksiyonumuz iki parametreli olduğu için onu iki boyutlu bir yüzey olarak
grafikleyebiliriz,
Bu iki boyutlu yüzey üzerindeki her nokta değişik bir çizgiyi temsil ediyor. Yüzeyin
alt düzlemden olan yüksekliği o çizgiye tekabül eden hata. Gördüğümüz gibi
bazı çizgiler bazılarından daha az hataya sahip (yani veriye daha iyi uymuş).
Gradyan inişi ile arama yaptığımız zaman bu yüzeyin herhangi bir noktasından
başlayacağız, ve yokuş aşağı inerek hatası en az olan çizgiyi bulacağız.
Hata fonksiyonu üzerinde Gİ işletmek için önce fonksiyonun gradyanını hesapla-
mamız lazım. Gradyan bizim için nerede olursak olalım her zaman dip noktasını
gösteren bir pusula görevini görüyor. Gradyan hesabı için hata fonksiyonunun
türevi alınmalı. Hata fonksiyonunun m, b adında iki tane parametresi olduğuna
göre bu iki parametrenin her biri için ayrı ayrı kısmi türev almamız lazım. Bu
türevler,
2 X
N
∂E
= −xi (yi − (mxi + b))
∂m N i=1
2 X
N
∂E
= −(yi − (mxi + b))
∂b N i=1
Artık Gİ işletmek için gerekli tüm araçlara sahibiz. Aramayı herhangi bir m, b
noktasından (herhangi bir çizgi) başlatırız, ve Gİ yokuş aşağı en iyi çizgi parame-
trelerine doğru gider. Her döngü m, b değerlerini bu inişe göre günceller (dikkat
inen parametreler değil, hatada inilirken bu inişe tekabül eden m, b değerleri), ki
bu sayede döngünün bir sonraki adımındaki hata bir öncekine göre azalmış olur.
Matematiğe biraz daha yakından bakalım [2]. Türev almak, türeve göre adım
atmak bir fonksiyonunun minimum noktasını bulmamızı nasıl sağlıyor? Basit
bir fonksiyon f(x)’i düşünelim,
7
Gradyan, ya da belli bir x noktasındaki değişim oranı y/x ile yaklaşıksallanabilir
(çoğunlukla literatur ∆ sembolünü kullanır, [2] kullanmış, önemli değil). Ya da
bu yaklaşıksallığı şöyle yazabiliriz,
∂f y f(x + x) − f(x)
= lim = lim
∂x →0 x →0 x
ki bu ifade f(x)’in x’e göre kısmi türevi olarak bilinir. Üstteki yöntem ile sembolik
olarak pek çok ifadenin türevini almayı biliyoruz, mesela ax2 için 2ax, vs.
Şimdi elimizde bir f(x) olduğunu düşünelim, ve x’i öyle bir şekilde değiştirmek
istiyoruz ki f(x) minimize olsun. Ne yapacağımız f(x)’in gradyanının ne olduğuna
bağlı. Üç tane mümkün durum var:
∂f
Eğer ∂x
> 0 ise x artarken f(x) artar, o zaman x’i azaltmalıyız.
∂f
Eğer ∂x
< 0 ise x artarken f(x) azalır, o zaman x’i arttırmalıyız.
∂f
Eğer ∂x = 0 ise f(x) ya minimum ya da maksimum noktasındadır, o zaman x’i
olduğu gibi bırakmalıyız.
Özet olarak x’i alttaki miktar kadar azaltırsak f(x)’i de azaltabiliriz,
∂f
x = xyeni − xeski = −η
∂x
ki η ufak bir pozitif sabittir, x’i değiştirirken bu atılan adımın büyüklüğünü dışarıdan
∂f
ayarlayabilmemizi sağlar, değişimin hangi yönde olacağını ∂x belirtiyor zaten.
Bu formülü ardı ardına kullanırsak, f(x) yavaş yavaş minimum noktasına doğru
“inecektir”, bu yönteme gradyan inişi minimizasyonu adı verilmesinin sebebi de
budur.
Örneğimize dönelim,
8
b_gradient += -(2/N) * (y - ((m_current * x) + b_current))
m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))
new_b = b_current - (eta * b_gradient)
new_m = m_current - (eta * m_gradient)
return [new_b, new_m]
eta = 0.0001
initial_b = 0 # initial y-intercept guess
initial_m = 0 # initial slope guess
num_iterations = 8
print "Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, i
print "Running..."
b = initial_b
m = initial_m
xx = np.linspace(np.min(points[:,0]),np.max(points[:,0]), 100)
for i in range(num_iterations):
b, m = step_gradient(b, m, np.array(points), eta)
if i % 2 == 0:
print i, b,m
yy = m * xx + b
plt.scatter(points[:,0],points[:,1])
plt.hold(True)
plt.scatter(xx,yy)
plt.hold(False)
plt.savefig('grad_desc_%d' % i)
print "After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m
9
Optimal m, b değerleri bulundu. m = −1, b = 0’da başladık ve optimal sonucu
bulduk. Değişken eta (yani η) adım büyüklüğü demiştik, dikkat eğer adım çok
büyük seçilirse minimum “atlanabilir”, yani varış noktası kaçırılabilir. Eğer η
çok küçük ise minimuma erişmek için çok vakit geçebilir. Ayrıca Gİ’nin doğru
işlediğini anlamanın iyi yollarından birisi her döngüde hatanın azalıp azalmadığına
bakmaktır.
Bu basit bir örnekti, fakat bir bedel fonksiyonunu minimize edecek parametre
değişimlerini yapma kavramı yüksek dereceli polinomlarda, ya da diğer Yapay
Öğrenim problemlerinde de işe yarıyor.
Gİ ile akılda tutulması gereken bazı konular:
1) Dışbükeylik (Convexity): Üstteki problemde sadece bir tane minimum vardı,
hata yüzeyi dışbükeydi. Nereden başlarsak başlayalım, adım atarak minimuma
erişecektik. Çoğunlukla durum böyle olmaz. Bazı problemlerde yerel minimumda
takılı kalmak mümkün olabiliyor, bu problemleri aşmak için farklı çözümler var,
mesela Rasgele Gradyan İnişi (Stochastic Gradient Descent) kullanmak gibi.
2) Performans: Örnekte basit bir Gİ yaklaşımı kullandık, çizgi arama (line search)
gibi yaklaşımlarla döngü sayısının azaltmak mümkün olabiliyor.
3) Yakınsama (Convergence): Aramanın bittiğinin kararlaştırılmasını kodlamadık,
bu çoğunlukla hata döngüsündeki değişimlere bakılarak yapılır; eğer hatadaki
değişim belli bir eşik değerinden daha küçük ise, gradyanın sıfır olduğu yere
yaklaşılmış demektir, ve arama durdurulabilir.
Not: Lineer regresyon tabii ki direk, tek bir adımda çözülebilen bir problem. Gİ’yi
burada bir örnek amaçlı kullandık.
Kaynaklar
[1] Zak, An Introduction to Optimization, 4th Edition
[2] Bayramli, Diferansiyel Denklemler, Kök Bulmak, Karesel Formül (Root Finding,
Quadratic Formula)
10
[3] Dutta, Optimization in Chemical Engineering
11
Newton’un Metodu (Newton’s Method)
Kısıtlanmamış bir pürüzsüz optimizasyon problemini düşünelim [6, 6:00],
min f(x)
Baktığımız f’in iki kez türevi alınabilir olduğunu düşünelim. Hatırlarsak gradyan
inişi nasıl işliyordu? Alttaki gibi,
Bir başlangıç x(0) ∈ Rn seçiliyor ve üstteki ardı ardına işletiliyor, her adımda
negatif gradyan yönünde tk boyunda adım atılıyor.
Kıyasla Newton metotu alttakini işletir,
−1
xk = xk−1 − ∇2 f(x(k−1) ) ∇f(xk−1 ), k = 1, 2, ...
]
1
Hessian nerede? Aslında var, ama birim matris 2t I olarak alındı. Alttaki res-
imde Newton metotu için yaratılan yaklaşıklamayı görüyoruz, bu büyük ihti-
malle daha iyi bir yaklaşıklama olacak çünkü karesel açılımda daha fazla bilgi
kullanıyor, bu sefer formülde ∇2 f(x) ile Hessian da var.
1
Bu yeni yaklaşıklama üzerinden x − (∇2 f(x))−1 ∇f(x) ile adım atınca belki yeşil
okla gösterilen yere geleceğiz, bu daha iyi bir nokta olabilecek. Atılan adım
formülünün resimdeki karesel formun minimize edicisi olduğunu görmek zor
değil.
Gradyan inişi ve Newton metotu adımları arasındaki farkı görmek için örnek bir
fonksiyona bakalım, f(x) = (10x21 + x22 )/2 + 5 log(1 + e−x1 −x2 ). Fonksiyonu kontur
grafiğini basınca alttaki gibi çıkıyor,
Siyah çizgi gradyan inişi, mavi Newton. Aynı yerden başlattım, ve gördüğümüz
gibi minimal noktaya doğru çok farklı yollar takip ediyorlar. Karşılaştırması ko-
lay olsun diye her iki tarafta atılan adım büyüklüklerini aynı tutmaya uğraştım.
Graydan inişinin attığı adımların yönünün niye böyle olduğu gayet bariz, tüm
adımlar görüldüğü gibi o noktadaki kontura dikgen, ki bu gradyanın tanımıdır
zaten, bir noktadaki gradyan oradaki konturun teğetine diktir / normaldir.
2
Newton tamamen farklı bir şekilde gidiyor. Resimde tüm adımlar tek bir çizgide
gibi duruyor ama aslında değil, başka bir yerden başlatsaydım bazen zigzaglı bile
gidilebileceğini görürdük [6, 13:40]. Newton’un adımlarını yorumlamanın görsel
olarak zihinde hayal etmenin iyi bir yolu onun her adımda bir küre, bir balon
yarattığını düşünmek, ve o balonun gradyanina göre adım atmak.
Dersin geri kalanında Newton metotunda geriye çizgisel iz sürme (backtracking)
yöntemini göreceğiz, ki “Newton metotu” denince aslında bu çeşitten bahsedilir,
üstteki bahsettiğimize “pür Newton” adı veriliyor. Sonra bazı yakınsama özelliklerine
bakacağız, ardından Newton metotunun bir çeşidi, eşitlik kısıtlamalı Newton
metotunu göreceğiz. Eğer zaman kalırsa Newton-umsu (quasi-Newton) metot-
lara da bakmak istiyorum.
Newton metotuna bakmanın bir diğer yolu nedir? Onun her adımda bir karesel
açılımı minimize ettiğini biliyoruz. Bir diğeri [6, 17:04] birinci derece optimalite
şartını lineerize etmek. Biz x’teyiz diyelim, öyle bir yön v arıyoruz ki o yönde bir
adım atınca gradyan sıfır hale gelsin, ∇f(x + v) = 0. Bu genel bir ifade değil mi,
ayrıca v bağlamında lineer, x sabit. Şimdi bu gradyanin lineer yaklaşıklamasını
yaparsak doğal olarak Hessian’lı ifadeye eriseceğiz,
Ve üstteki formülü v için çözersek, bu bizi tekrar daha önce gösterdiğimiz New-
−1
ton adımına götürüyor, v = − ∇2 f(x) ∇f(x)
Bu metotun tarihi bir arka planı da var, İsaac Newton bizim bugün Newton
metotu dediğimiz yöntemi minimizasyon için değil, kök bulmak için keşfetti.
Düşündü ki gayrı-lineer bir denklemin çözümlerini bulmak istiyorsan böyle bir
metot gerekli. Tek boyutta düşünelim, mesela bir g var, onun köklerini bulmak is-
tiyoruz, o zaman Newton metotu kullan. Hatta genel fonksiyonlar için bile değil,
polinomlar için bu yöntemi bulmuştu. Rhapson, bir diğer bilimci, aynı şekilde,
aynı metotu düşündü. O sebeple bu metota bazen Newton-Rhapson adı ver-
ildiğini de görebilirsiniz. Çok sonraları bilimciler bu metotu minimizasyon için
kullanmayı akıl etti, gradyanı sıfıra eşitliyerek. Bu kullanım çoğunlukla Simp-
son’a atfedilir.
Devam edelim, Newton adımının önemli bir özelliği onun ılgın değişmezliği
(affine invariance). Bu ne demek? Bir lineer transformasyona bakalım. Diyelim
ki f, x üzerinden Newton adımı hesaplıyorken ben gelip diyorum ki “x üzerinde
değil yeni bir değişken y üzerinden bunu yapmanı istiyorum” ve formül x = Ay,
ve g(y) = f(Ay). O zaman g üzerinde Newton adımları neye benzer?
3
= y − A−1 (∇2 f(Ay))−1 f(Ay)
ki
koşuluna bakarız. Soldaki Newton adımı, sağdaki o yönde ama daha ufak, αt
kadar ufak bir lineer yaklaşıklama, ara değerleme (interpolation). Yani t’nin bir
4
kısmı kadar, α kısmı kadar yönde bir ilerleme kaydedip etmeyeceğimize bakıyoruz,
eğer üstteki şart doğruysa o t’yi adım olarak seçiyoruz. Yoksa t = βt ile t’yi
küçültüp alt döngüde aynı işlemi bir daha tekrarlıyoruz.
Newton yönteminin çok hızlı yakınsadığını söylemiştik, arama adımını hesaba
katınca bile bu doğru. Peki hiç dezavantajı yok mu? Bir tane var, eğer Hessian
yoğun (dense) matris ise o zaman temel lineer cebir’e göre tersini hesaplamak ne
kadar yük getirir? O(n3 ) değil mi? Bu ağır bir yük olabilir.
[yakınsama analizi atlandı]
Şimdi Newton’un yöntemini birinci derece yöntemlerle (gradyan inişi gibi) karşılaştıralım.
• Bellek: her adımda Newton yöntemi O(n2 ) yer tutar, çünkü Hessian n ×
n boyutunda, kıyasla her gradyan adımı O(n) yer tutar, çünkü n boyutlu
gradyan var.
• Hesap: her adıma O(n3 ) hızında, eğer yoğun n × n boyutunda bir lineer
sistemi çözmek gerekiyorsa. Ama her gradyan iniş adımı O(n) hızında
işler, çünkü n boyutlu bir vektörü topluyoruz, ölçekliyoruz, basit işlemler
yapıyoruz yani.
5
Bu durumda bellek ve hesapsal yük her adım için O(n) olacaktır.
Yapıya sahip Hessian’lar alttaki gibi durumlarda ortaya çıkabilir,
• Eğer g(β) = f(Xβ) ise o zaman ∇2 g(β) = XT ∇2 f(Xβ)X olur. Yani eğer X
bir yapıya sahip tahmin edici matris ise ve ∇2 f köşegen ise o zaman ∇2 g
yapıya sahiptir.
Bu tür problemleri çözmek için elimizde aşağı yukarı üç yöntem var.
1) Eşitlik sınırlamalarını yoket. Problemi A’nin sıfır uzayı bağlamında tekrar
parametrize et, yani x = My + xo yap, M, A’nin sıfır uzayını kapsar, ve Ax0 =
b’dir. Çözümü y bağlamında yap.
Bu fena bir çözüm değil, ama A’nin sıfır uzayını kapsayan bir M bulmamızı
gerektiriyor. Ayrıca problemde yapı varsa bunu bozmuş olabiliriz, seyrek Hes-
sian elimizde olabilir ama değişim sonrası Hessian yoğun olabilir.
2) İkizi türet. Daha önce gördük ki bu tür problemlerde ikizi hesaplarken eşitlik
sınırı kritere dahil ediliyordu. Ama bu da her zaman kolay değildir.
3) Eşitlik kısıtlamalı Newton yöntemi. Çoğu durumda en direk yaklaşım budur.
Bu yöntemde x(0) ile başlarız, ki Ax(0) = b olacak şekilde, ve
x+ = x + tv
adımı atarız, ama normal Hessian’lı karesel açılımı minimize etmek yerine yeni
bir sınırlama ekleyeceğiz, her Newton adımının saygı göstermesi gereken Az = 0
şartı koyacağız,
1
v = arg min ∇f(x)T (z − x) + (z − x)T ∇2 f(x)(z − x)
Az=0 2
Böylece her adımda kısıtlanmış bölge içinde kalmış olacağız. Üstteki eşitlik şartını
KKT dersimizde görmüştük, bu hesap tek bir lineer sistemi çözmeye indirgenebiliy-
ordu. Lineer sistemi tekrar altta veriyorum,
6
∇2 f(x) AT
v −∇f(x)
=
A 0 w 0
1
f(x) ≈ f(x̄) + ∇f(x̄)T (x − x̄) + (x − x̄)T F(x − x̄)
2
ki F Hessian matrisi. Üstteki formüle h(x) diyelim. Böylece bir karesel model
ortaya çıkartmış oldum, formülün sağ tarafındaki çarpım onu karesel yapıyor,
ve şimdi onu kesin olarak çözmek istiyorum. Bunu nasıl yaparım? Formülün
gradyanını sıfıra eşitleyebilirim. Üstteki fonksiyonun x’teki gradyanı nedir?
Gradyanı x’e göre aldığımızı unutmayalım, h(x)’in ikinci terimi ∇f(x̄)T bir sabit
sayı, ikinci gradyan alınırken sıfırlanır, ve tüm ikinci terim sıfırlanır. Üçüncü
T
terimin gradyanını almak bir nevi ∂(x∂xAx) almak gibi [1], F belli bir noktadaki
ikinci türev matrisi olduğu için A gibi bir sabit matris kabul edilebilir, A simetrik
olunca gradyan 2Ax sonucunu veriyordu, F simetrik, o zaman üçüncü terimde F
kalır, 2 ve 1/2 birbirini iptal eder, sonuç
7
∇h(x̄) = ∇f(x̄) + F(x̄)(x − x̄)
İki üstteki karesel yaklaşıksal ifadenin gradyanı bu işte. Onu sıfıra eşitleriz ve
çözeriz. F tersi alinabilir bir matristir, o zaman
8
NY’nin en çekici tarafı, eğer yakınsama (convergence) mümkün ise bu yakınsamanın
çok hızlı bir şekilde olması, ki bu iyi. Bu konuya gelmeden metodun bazı ek
özelliklerini görelim.
Terminoloji: bir matrise SPD denir eger matris simetrik, pozitif kesin ise (simetric
positive-definite).
Teklif (Proposition) 1:
Eğer F(x) SPD ise d 6= 0, o zaman d x̄ noktasında bir iniş yönüne işaret eder. İniş
yönü olması demek, eğer makul ufak bir adım çerçevesinde gidilen noktada f’in
değerinin o an olduğumuz noktadan daha az olması demektir.
Nasıl ispatlarım? Önceki dersten hatırlarsak, eğer yönüm gradyan ile negatif iç
çarpıma sahip ise, o zaman yönüm kesinlikle bir iniş yönüydü.
Teori
Diyelim ki f(x) fonksiyonu x̄ noktasında türevi alınabilir halde [2, sf. 9]. Eğer
elimizde ∇f(x̄)T d < 0 sonucunu veren bir d vektörü var ise, öyle ki her yeterince
küçük λ > 0 için f(x̄ + λd) < f(x̄) olacak şekilde, o zaman d bir iniş yönüdür.
İspat
Taylor açılımı ile yönsel türev tanımına bakarsak,
∇f(x̄)T d < 0 olduğuna göre (aradığımız şart bu) o zaman, ve α(x̄, λd) → 0, λ → 0
iken, her yeterince küçük λ > 0 için f(x̄ + λd) − f(x̄) < 0 olmalıdır, yani her
hangi bir yönde atılan adım bir önceki f değerinden bizi daha ufak bir f değerine
götürmelidir.
Ana Teklif’e dönelim. Newton adımınıdaki SPD F için 0 < dT ∇f olduğunu
göstermemiz lazım (ki böylece iniş yönü olduğunu ispatlayabilelim, bir önceki
teori),
d = −F−1 ∇f(x̄)
9
d∇f(x) = −∇f(x)F−1 ∇f(x)
Eşitliğin sağ tarafındaki ifade hangi şartlarda eksi olur? Eğer F matrisi pozitif
kesin ise değil mi? Genel matrislerden hatırlarsak, matris A ve bir vektör için
v eğer A pozitif kesin ise vT Av > 0. Daha önce F’nin pozitif kesin olduğunu
söylemiştik, o zaman bir şekilde eğer F pozitif kesin olmasının sadece ve sadece
F’nin tersinin pozitif kesin olmasına bağlı olduğuna gösterebilirsem amacıma
ulaşabilirim.
Bunu yapmak aslında pek zor değil. Biliyorum ki F(x) SPD. Simdi herhangi bir
vektor v icin
0 < vT F(x)−1 v
f 0 (x)
2 1
−1
d = −F(x) ∇f(x) = − 00 = −x 7 − = x − 7x2
f (x) x
10
import pandas as pd
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 20)
pd.set_option('display.max_rows', 30)
pd.set_option('display.width', 82)
pd.set_option('precision', 6)
df = pd.DataFrame(index=np.arange(11))
def calculate_newton_ex1(x):
arr = []
for i in range(11):
arr.append(x)
x = 2*x - 7*x**2
if (x > 1e100): x = np.inf
if (x < -1e100): x = -np.inf
return arr
df['1'] = calculate_newton_ex1(1.0)
df['2'] = calculate_newton_ex1(0.0)
df['3'] = calculate_newton_ex1(0.1)
df['4'] = calculate_newton_ex1(0.01)
print (df)
1 2 3 4
0 1.000000e+00 0.0 0.100000 0.010000
1 -5.000000e+00 0.0 0.130000 0.019300
2 -1.850000e+02 0.0 0.141700 0.035993
3 -2.399450e+05 0.0 0.142848 0.062917
4 -4.030157e+11 0.0 0.142857 0.098124
5 -1.136952e+24 0.0 0.142857 0.128850
6 -9.048612e+48 0.0 0.142857 0.141484
7 -5.731417e+98 0.0 0.142857 0.142844
8 -inf 0.0 0.142857 0.142857
9 -inf 0.0 0.142857 0.142857
10 -inf 0.0 0.142857 0.142857
Örnek 2
Bu örnekte iki değişkenli bir fonksiyon görelim. Global minimum (1/3, 1/3).
Bakalım bu değeri bulabilecek miyiz?
f(x) = − ln(1 − x1 − x2 ) − ln x1 − ln x2
1 1
1−x1 −x2
− x1
∇f(x) = 1 1
1−x1 −x2
− x2
11
def calculate_newton_ex2(x):
arr = []
for i in range(8):
arr.append(x)
x1,x2 = x[0],x[1]
F = [[(1.0/(1.0-x1-x2))**2 + (1.0/x1)**2.0, (1.0/(1.0-x1-x2))**2.0],
[(1.0/(1.0-x1-x2))**2, (1.0/(1.0-x1-x2))**2.0 + (1.0/x2)**2.0]]
F = np.array(F)
d = np.dot(-lin.inv(F),Df)
x = x + d.flatten()
return np.array(arr)
res = calculate_newton_ex2([0.85,0.05])
print (res)
[[0.85 0.05 ]
[0.717 0.097]
[0.513 0.176]
[0.352 0.273]
[0.338 0.326]
[0.333 0.333]
[0.333 0.333]
[0.333 0.333]]
12
özellikleri var. Fakat eğer sonuca uzaktan bir yerden başlamışsak yakınsaklık
garantisi yok. Geldiğimiz yeni noktada Hessian eşsiz olabilir. Bu sebeple metot
sürekli iniş özelliğine (descent property) sahip olmayacaktır, yani f(xx+1 ) > f(xk )
olabilir, ve yakınsaklık garantisi bu durumda kaybolur [4, sf. 167]. Fakat bu al-
goritmayı biraz değiştirerek sürekli iniş özelliğine sahip olmasını sağlayabiliriz.
Teori
x1 , x2 , ... ya da kısaca {xk } Newton’un metodu tarafından üretilmiş f(x) hedef
fonksiyonunu minimize etme amaçlı bir çözüm dizisi olsun. Eğer Hessian F(x)k
pozitif kesin ise ve gradyan gk = ∇f(xk ) 6= 0 ise, o zaman çözüm yönü
bir iniş yönüdür, ki bu ifadeyle kastedilen bir ᾱ > 0 kesinlikle vardır öyle ki her
α ∈ (0, ᾱ) için
ifadesi doğrudur.
İspat
φ(α) diye yeni bir eşitlik yaratalım,
−gTk F(xk )−1 gk ifadesinin sıfırdan küçük olduğunu biliyoruz çünkü F(xk )−1 poz-
itif kesin, ve gk 6= 0. O zaman diyebiliriz ki bir ᾱ > 0 mevcuttur öyle ki her
α ∈ (0, ᾱ) için φ(α) < φ(0). Bu da demektir ki her α ∈ (0, ᾱ) için
İspat tamamlandı.
Üstteki gördüklerimiz dk yönünde bir arama yaparsak, muhakkak bir minimum
bulacağımızı söylüyor. Eğer her geldiğimiz noktada, bir sonraki gidiş noktasını
13
hesap için bu minimum yeri ararsak, sürekli iniş özelliğine kavuşmuş olacağız,
ve böylece Newton metodunu kurtarmış olacağız. Demek ki Newton metotunu
şu şekilde değiştirmemiz gerekiyor,
ki
Yani döngünün her adımında −F(xk )−1 gk yönünde bir arama gerçekleştiriyoruz,
o yöndeki en fazla azalmayı buluyoruz, ve αk adımını o büyüklükte seçiyoruz.
Ve üstteki teori sayesinde gk 6= 0 olduğu sürece
def f(x):
x1,x2=x
return anp.exp(x1 + 3.0*x2 - 0.1) + anp.exp( x1 - 3.0*x2 - 0.1 ) + anp.exp(-x1-0.1
alpha = 0.1
beta = 0.7
eps = 0.001
x0 = np.array([-1.1, 1.0])
x = x0
hist = []
for i in range(10):
h = autograd.hessian(f)
g = autograd.grad(f)
v = np.dot(-lin.inv(h(x)),g(x))
lamsq = np.dot(np.dot(g(x).T,lin.inv(h(x))),g(x))
hist.append(x)
if lamsq/2 <= eps:
print ('done')
14
break
t = 1.0
while f(x+t*v) >= f(x)+alpha*t*np.dot(g(x).T,v): t = t*beta
x = x + t*v
h = np.array(hist)
h = np.reshape(h,(len(h),2))
print (h)
done
[[-1.10000000e+00 1.00000000e+00]
[-1.43075233e-01 3.50917569e-01]
[-1.09323466e-01 8.11516892e-02]
[-3.28295993e-01 1.89932171e-02]
[-3.45760583e-01 3.51878538e-04]]
def f2(x1,x2):
return f([x1,x2])
D = 50
x = np.linspace(-2.0,1.0,D)
y = np.linspace(-1.0,1.0,D)
xx,yy = np.meshgrid(x,y)
zz = f2(xx,yy)
contours = [1,2,3,4,5,6]
cs=plt.contour(xx,yy,zz,contours)
plt.plot(h[:,0],h[:,1],'rd')
plt.plot(h[:,0],h[:,1])
plt.savefig('boyd-1092.png')
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xx, yy, zz)
plt.savefig('boyd-1091.png')
Kaynaklar
15
[1] Bayramlı, Çok Boyutlu Calculus, Vektör Calculus, Kurallar, Matris Türevleri
[2] Freund, MIT OCW Nonlinear Programming Lecture, https://ocw.mit.edu/
courses/sloan-school-of-management/15-084j-nonlinear-programming-
spring-2004/
[3] Miller, Numerical Analysis for Scientists and Engineers
[4] Zak, An Introduction to Optimization, 4th Edition
[6] Tibshirani, Convex Optimization, Lecture Video 14, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[7], Boyd, Convex Optimization I, Video Lecture 16
[8], Boyd, Convex Optimization I, Lecture Notes
16
Genel Optimizasyon, Paketler, Autograd
Otomatik türevin nasıl işlediğini [1] yazısında gördük. Programlama dilinde
yazılmış, içinde if, case, hatta döngüler bile içerebilen herhangi bir kod parçasının
türevini alabilmemizi sağlayan otomatik türev almak pek çok alanda işimize yarar.
Optimizasyon alanı bunların başında geliyor. Düşünürsek, eğer sembolik olarak
türev alması çok çetrefil bir durum varsa, tasaya gerek yok; bir fonksiyonu kod-
layabildiğimiz anda onun türevini de alabiliriz demektir.
Autograd
Çok boyutlu bir fonksiyonun gradyani ve Hessian’ı,
def objective(X):
x, y, z = X
return x**2 + y**2 + z**2
x,y,z = 1.0,1.0,1.0
h = hessian(objective, 0)
res = h(np.array([x, y, z]))
print (res)
g = grad(objective, 0)
res = g(np.array([x, y, z]))
print (res)
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
[2. 2. 2.]
Ya da
Hessian
Mesela f(x1 , x2 ) = x32 + x32 + x21 x22 gibi bir fonksiyon var diyelim. Belli bir noktadaki
Hessian
∂f ∂f
∂x1 x1 ∂x1 x2
H= ∂f ∂f
∂x2 x1 ∂x2 x2
import autograd
def f(x):
x1,x2=x[0],x[1]
return x1**3 + x2**3 + (x1**2)*(x2**2)
1
xx = np.array([1.0,1.0])
h = autograd.hessian(f)
print (h(xx))
[[8. 4.]
[4. 8.]]
min f(x)
x
işlemi. Peki minimumu nasıl tanımlarız? Bir nokta x∗ global minimize edicidir
eğer tüm x’ler için f(x∗ ) 6 f(x) ise, ki x ∈ Rn , en azından x modelleyeni ilgilendi-
ren tüm küme öğeleri için.
Fakat çoğu zaman bir global f’i kullanmak mümkün olmayabilir, fonksiyon çok
çetrefil, çok boyutlu, bilinmez durumdadır, ve elimizde sadece yerel bilgi vardır.
Bu durumda üstteki tanımı “bir N bölgesi içinde” olacak şekilde değiştiririz ki
bölge, x∗ etrafındaki, yakınındaki bölgedir.
Üstteki tanımı okuyunca x∗ ’in yerel minimum olup olmadığını anlamanın tek
yolunun yakındaki diğer tüm noktalara teker teker bakmak olduğu anlamı çıkabilir,
fakat eğer f pürüzsüz bir fonksiyon ise yerel minimumu doğrulamanın çok daha
hızlı bir yöntemi vardır. Hatta ve hatta eğer fonksiyon f iki kez türevi alınabilir
haldeyse x∗ ’in yerel minimum olduğunu ispatlamak daha kolaylaşır, ∇f(x∗ ) ve
Hessian ∇2 f(x∗ )’e bakarak bunu yapabiliriz.
Minimallik için 1. ve 2. derece şartlar var. 1. derece gerekli şart (ama yeterli
değil) ∇f = 0 olması. Bu standard Calculus’tan bildiğimiz bir şey, minimum
ya da maksimumda birinci türev sıfırdır. Ama türevin sıfır olup minimum ya da
maksimum olmadığı durum da olabilir, mesela f(x) = x3 . f 0 (0) = 0’dir fakat x = 0
ne maksimum ne de minimumdur. Daha iyi bir termioloji ∇f = 0 noktalarını
kritik nokta olarak tanımlamaktır. x = 0 noktasında bir değişim oluyor, bu değişim
kritik bir değişim, her ne kadar minimum ya da maksimum olmasa da.
x = np.linspace(-3,3,100)
plt.plot(x,x**3)
plt.grid(True)
plt.savefig('func_40_autograd_01.png')
2
Bir kritik noktanın yerel maksimum ya da yerel minimum olup olmadığını anla-
mak için fonksiyonun ikinci türevine bakabiliriz. Bir f : Rn → R var ve x∗ nok-
tasının kritik nokta olduğunu düşünelim, yani ∇f(x∗ ) = 0. Şimdi çok ufak bir h
adımı için f(x∗ + h)’a ne olduğuna bakalım. Burada Taylor açılımı kullanabiliriz
[2],
1
f(x + h∗ ) = f(x∗ ) + ∇f(x∗ )h + hT f(x∗ )∇2 (x∗ )f(x∗ )h + O(3)
2
∇2 (x∗ ) bir matristır içinde f’nin ikinci derece türevleri vardır [6]. Şimdi, kritik
noktada olduğumuz için ∇f(x∗ ) = 0, ve O(3) terimlerini iptal edersek, üstteki
1
f(x∗ + h∗ ) − f(x∗ ) = hT ∇2 (x∗ )h + O(3)
2
haline gelir. Simdi “bir noktanın mesela yerel maksimum olması” sözünü f(x∗ +
h∗ ) − f(x∗ ) < 0 ile ifade edebiliriz, çünkü x∗ etrafındaki tüm x’lerin f’in daha
az değerlerinden olma şartını aramış oluyoruz (adım atılıyor, çıkartma yapılıyor,
sonuç sıfırdan küçük). Tabii bu “tüm” söylemi yaklaşıksal, o sebeple minimum-
luk ifadesi yerel.
Devam edersek f(x∗ + h∗ ) − f(x∗ ) < 0 olması şartı aynı zamanda 21 hT ∇2 (x∗ )h < 0
anlamına gelir, bu da ∇2 (x∗ ) negatif kesin demektir. Çünkü A simetrik bir matris
olduğu zaman
xT Ax < 0 ise matris negatif kesin
xT Ax 6 0 ise matris negatif yarı-kesin (negatif semi-definite)
xT Ax > 0 ise matris pozitif kesin
xT Ax > 0 ise matris pozitif yarı-kesin (positive semi-definite)
Gradyan Inisi
Optimizasyonun mekaniğine gelelim. Diyelim ki basit, tek boyutlu bir f(x) = x2
3
fonksiyonumuz var. Tek boyutlu bu ortamda bir noktadan başlayıp gradyanın (1.
türev) işaret ettiği yönde ufak bir adım atmak bizi minimuma daha yaklaştırır, ve
bunu ardı ardına yaparak yerel bir minimuma erisebiliriz. Örnek f(x) dışbükey
(convex) olduğu için bu bizi global minimuma götürür [3]. Formül
xi+1 = xi + α∇f(xi )
Başlangıç x0 herhangi bir nokta, üstteki formülle adım ata ata ilerliyoruz, adım
boyutunu bizim tanımladığımız bir α sabitiyle ayarlayabiliyoruz.
import autograd
def fun(x):
return x**2
\includegraphics[height=6cm]{func_40_autograd_02.png}
return xs
alpha = 0.1
x0 = 1.
plt.plot(x_true, y_true)
plt.plot(x_opt, y_opt, 'o-', c='red')
plt.show()
4
Türevi autograd ile aldık, bu örnekte sembolik türev kolaydı, elle f 0 (x) = 2x diye-
bilirdik ama gösterim amaçlı direk yazılımla türevi aldık.
Kısıtlanmış Optimizasyon
Mühendislik problemlerinde kısıtlanmış optimizasyon çok ortaya çıkar. Prototipik
örnek bir düzlem üzerindeki orijine en yakın noktayı bulmak. Mesela düzlem
2x − y + z = 3 olsun, ve mesafeyi minimize etmek istiyoruz, bunu x2 + y2 + z2
ile hesaplayabiliriz. Yani optimizasyon problemi düzlem denklemi ile sınırlanan
mesafe formülünün minimal noktasını bulmak [5].
Problemi direk scipy.optimize.minimize ile çözelim.
x0 = [1, 1, 1]
sol = minimize(objective, x0, constraints={'type': 'eq', 'fun': cons})
print (sol)
fun: 1.5000000035790053
jac: array([ 1.99997392, -1.00010441, 0.99994774])
message: 'Optimization terminated successfully.'
nfev: 22
nit: 4
njev: 4
status: 0
success: True
x: array([ 0.99998696, -0.50005221, 0.49997386])
Fonksiyon minimize için kısıtlamalar eq ile sıfıra eşit olma üzerinden tanımlanır.
Eğer ineq kullanılırsa sıfırdan büyük olma tanımlanıyor o zaman mesela x > 0
5
ve x < 5 kısıtlamalarını getirmek istersek,
Bazen her şeyi kendimiz yaparak tüm adımların ne yaptığından emin olmak
isteyebiliriz. Mesela kısıtlama şartlarını kendimiz bir Lagrange çarpanı f(x)f(x)−
λg(x) ifadesi üzerinden tanımlayıp, türevi alıp sıfıra eşitleyip, fx (x) = fy (x) =
fz (x) = g(x) = 0 ile, elde edilen kısıtsız optimizasyonu çözmeyi tercih edebiliriz.
Türevin alınmasını direk autograd’a yaptırırız.
import autograd.numpy as np
from autograd import grad
def F(L):
x, y, z, _lambda = L
return objective([x, y, z]) - _lambda * eq([x, y, z])
dfdL = grad(F, 0)
Aynı sonuç bulundu. Şimdi merak ediyoruz, bu sonuç gerçekten minimum mu?
Üstteki noktada Hessian’ın pozitif kesin olup olmadığını kontrol edebiliriz. Hes-
sian’ı da autograd hesaplar! Once gradyan,
6
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
Bu matris pozitif kesin, ama çıplak gözle bariz değilse, tüm özdeğerleri pozitif
olup olmadığına bakabiliriz,
[2. 2. 2.]
g(w1 , w2 ) = tanh(w1 w2 )
import autograd
from autograd import numpy as anp
def g(w_1,w_2):
return anp.tanh(w_1*w_2)
7
g’nin her iki kısmi türevini ve gradyanını,
∂
∂w1
g(w1 , w2 )
∇g(w1 , w2 ) = ∂
∂w2
g(w1 , w2 )
dgdw1 = autograd.grad(g,0)
dgdw2 = autograd.grad(g,1)
[0.14130164970632894, 0.07065082485316447]
Tabii çok boyutlu ortamda yazının başındaki teknikleri kullanmak daha iyi, üstteki
bir seçenek.
Kaynaklar
[1] Bayramlı, Ders Notları, Otomatik Türev Almak (Automatic Differentiation -AD-)
[2] Schrimpf, http://faculty.arts.ubc.ca/pschrimpf/526/526.html
[3] Stoyanov, https://nikstoyanov.me/post/2019-04-14-numerical-
optimizations
[5] Kitchin, http://kitchingroup.cheme.cmu.edu/blog/2018/11/03/
Constrained-optimization-with-Lagrange-multipliers-and-autograd/
[6] Bayramli, Cok Boyutlu Calculus, Vektör Calculus, Kurallar, Matris Türevleri
[7] Watt, Automatic Differentiation, https://jermwatt.github.io/machine_
learning_refined/notes/3_First_order_methods/3_5_Automatic.html
8
Altgradyanlar (Subgradients)
Altgradyanlar aslında bir algoritma değil, bir matematiksel kavram [1, 40:29], ve
hem optimizasyon, hem analiz, hem de pratik bağlamda çok faydalı bir kavram.
Hatırlarsak dışbükey ve türevi alınabilir bir f için
gerekli ve yeterli bir şart. Yani fonksiyonuma herhangi bir noktada oluşturacağım
teğet eğri, lineer yaklaşıksallık, fonksiyonum için bir global eksik / az tahmin
edici (underestimator) olacaktır, yani hep ondan küçük kalacaktır.
Altgradyan nedir? Altgradyan üstteki gradyanin yerini alabilecek herhangi bir
g vektörüdür, yerine alabilecek derken üstteki ifade her y için hala doğru olacak
şekilde. Dışbükey fonksiyon f’nin x noktasında altgradyanı herhangi bir g ∈
Rn ’dir öyle ki
Teğet çizgi hakkında: görsel olaral hayal edersek kap şeklinde, yani dışbükey
olan bir fonksiyona nerede teğet çizgi çekersem çekeyim fonksiyonun kendisi
hep o çizginin üstünde kalır. Eğer fonksiyonum kap olmasaydı, habire aşağı
yukarı inip çıkıyor olsaydı bir noktada o çizginin altına düşülebilirdi. Eğer f
türevi alınabilir ise dışbükey olmasının şartı üstteki ifadenin doğru olması.
Dışbükey fonksiyonlar için
1) g her zaman mevcuttur (dışbükey olmayan fonksiyonlar için g’nin mevcud-
iyeti şart değildir). Bu güzel bir özellik.
2) Eğer x noktasında f’in türevi alınabilir ise, tek bir altgradyan vardır, o da
türevin kendisidir [1, 43:12], g = ∇f(x).
Aslında #2 kalemi dışbükey olmayan bir f için bile geçerli, eğer g varsa. Bu du-
rumlarda illa altgradyan olması gerekmiyor, hatta türevi alınabilir dışbükey ol-
mayan f için bile g olmayabiliyor.
Dışbükey olmayan (pürüzsüz) ve altgradyanı olmayan bir fonksiyon örneği nedir?
Alttaki,
Bu fonksiyonun hiçbir yerde altgradyanı yok. Eğri üzerinde bir nokta arıyorum
1
öyle ki oradan geçen bir çizgi tüm fonksiyonu üstte bıraksın.. böyle bir çizgi
çizilemez. Altgradyan yok [1, 43:54]. Bazılarımız itiraz edebilir, “üstteki bir
içbükey fonksiyon, dışbükeyin ters çevrilmiş hali”. O zaman x3 diyelim, pürüzsüz,
ve altgradyanı yok.
Altgradyanı mevcut fonksiyonlar görelim, mesela mutlak değer fonksiyonu f(x) =
|x|.
Eğer x 6= 0 ise bu fonksiyonun türevi alınabilir (yoksa alınamaz, bir yaygın görüşe
göre x = 0’da problem yok, ama var) ve altgradyanı onun mevcut gradyanı,
x/||x||2 . x = 0 noktasında altgradyan g {z : ||z||2 < 1} kümesinin herhangi bir öğesi.
Şimdi f(x) = ||x||1 ’e bakalım,
2
Bu fonksiyonun x = 0’da türevi alınamaz, aynen tek boyutlu (mutlak değer
fonksiyonu) versiyonunda olduğu gibi. Ayrıca bu fonksiyonun herhangi bir ek-
sende sıfır değer olduğu zamanda da türevi alınamaz. Altgradyan için öğe öğe
yaklaşmak lazım, eğer bir öğe xi 6= 0 ise gi = sign(xi ), eğer xi = 0 ise gi ∈
[−1, +1].
En son örnek [1, 48:35] iki dışbükey fonksiyonun maksimumu olanı, yani f(x) =
max{f1 (x), f2 (x)} ki f1 , f2 dışbükey ve türevi alınabilir olmak üzere, ve f(x) bu
iki fonksiyonun her x noktasında f1 (x) ve f2 (x)’den hangisi büyükse o. Bu tür
bir maks fonksiyonunun sonucunun dışbükey olduğunu önceki derslerden biliy-
oruz.
Altgradyan yine farklı şartlara göre değişik oluyor. Eğer f1 (x) > f2 (x) o zaman
altgradyan özgün, g = ∇f1 (x). Eğer f2 (x) > f1 (x) ise altgradyan özgün, g =
∇f2 (x).
Kabaca çizersek birbirlerini kesen f1 ve f2 düşünelim,
3
onların maks halleri yeşil ile [çok kabaca benim eklediğim] çizgi, yani kesişmenin
solunda f2 sağında f1 . Tabii ki sol tarafta f2 aktif o zaman onun gradyanı geçerli,
sağ tarafta f1 . Kesişme noktası, f1 = f2 ilginç, g = α∇f1 (x) + (1 − α)f2 (x), yani
f1 , f2 ’nin herhangi bir dışbükey kombinasyonu, ki iki üstteki resimde görülen iki
kesikli çizgiler bazı örnekler.
Altdiferansiyel (Subdifferential)
Dişbükey f’in tüm altgradyanlarına altdiferansiyel denir [1, 52:35]. Çoğunlukla
kısmi türev için kullanılan aynı sembolle gösterilir, ∂ ile.
Eğer iki üstteki ifadeyi α ile bir üstteki ifadeyi 1 − α ile çarparsam ve toplarsam,
basitleştirme sonrası (1)’i elde ederim. İspat böylece tamamlanır [1, 55:11].
4
Dikkat edersek f’nin dışbükey olup olmadığından bahsetmedik bile.
2) Boş Olmamak: eğer f dışbükey ise ∂f(x) boş değildir.
3) Tek Altgradyan: önceden bahsettik ama eğer f x noktasında türevi alınabilir ise
altdiferansiyelde tek bir öğe vardır o da o noktadaki gradyandır, ∂f(x) = {∇f(x)}.
4) Üstteki özelliğe tersten bakarsak, eğer ∂f(x) = {g}, yani altdiferansiyelde tek
bir öğe var ise, o zaman f o noktada türevi alınabilir demektir ve o noktadaki
gradyan g’dir.
[disbukey geometri baglantisi atlanti]
Altdiferansiyel Calculus
Altgradyanların kendine has bir Calculus’u var, aynen gradyanları, vs. içeren
Çok Değişkenli Calculus’ta olduğu gibi [1, 59:53]. Birazdan göstereceklerimizden
daha fazlası ama alttakiler en faydalı olanları [1, 1:00:00]. Dişbukey f fonksiyon-
ları için alttakiler geçerlidir,
Ölçekleme: ∂(af) = a · ∂f, a sabit ise ve a > 0 olacak şekilde
Toplama: ∂(f1 + f2 ) = ∂f1 + ∂f2
Doğrusal Bileşim: Eğer g(x) = f(Ax + b) ise o zaman ∂g(x) = AT ∂f(Ax + b). Bu
altgradyanlar için bir tür Zincirleme Kanunu gibi. Hatta eğer f türevi alınabilir
ise, bu ifade tamı tamına Zincirleme Kanunu olurdu.
Noktasal Sonlu Maksimum: Eğer f(x) = maxi=1,..,m fi (x) ise, o zaman
[
∂f(x) = conv ∂fi (x)
i:fi (x)=f(x)
Biraz karmaşık duruyor ama daha önce iki fonksiyon maksimumu üzerinden
gördüğümüz kavrama benziyor. Her noktada maks olan fi ’leri alıyoruz, ve bu
fonksiyonların altgradyanlarını hesaplıyoruz. Ama bu altgradyanların birleşimi
her zaman bir dışbükey küme oluşturmayabilir, ve altdiferansiyelin bir dışbükey
küme olması gerekir, o zaman için elimizde olan altgradyanların conv ile dışbükey
zarfına (convex hull) bakarız. Yani sadece birleşim ∪ ile elde ettiğim kümeyi bir
işlemden daha geçirerek onun dışbükey küme halini alıyorum.
[atlandi, norm, 1:09:00]
Niye Altgradyanlar?
1) Optimizasyon: Önemli bir sebep [1, 1:12:00]. Bir dışbükey fonksiyonun alt-
gradyanını hesaplamak her zaman mümkündür, o zaman her dışbükey fonksiy-
onu minimize edebilirim. Bazı durumlarda bu yavaş olabilir ama en azından
minimizasyon mümkün olur.
2) Dışbükey Analizi: Her f için, dışbükey olsun olmasın,
5
f(x∗ ) = min f(x) ⇐⇒ 0 ∈ ∂f(x∗ )
x
Yani x∗ bir minimize edicidir sadece ve sadece 0 değeri f’in x∗ noktasında bir
altgradyanı ise. Bu özelliğe çoğunlukla “altgradyan optimalliği” adı veriliyor.
İspatı basit. Eğer g vektörü x∗ noktasındaki altgradyan ise o zaman alttaki ifade
her y için doğrudur,
Üstteki ifade x∗ bir minimize edicidir diyor, o zaman sıfır bir altgradyandır.
Bazen üstteki ifadenin dışbükey olmayan fonksiyonlar için bile geçerli olduğunu
unutanlar oluyor [1:14:32]. Bu her f için doğru diyorum bazen bana şaşırmış
şekilde bakıyorlar. Söylenen biraz sürpriz edici, evet. İkizlik ve KKT şartları
hakkında konuşurken benzer şaşırtıcı ifadeler olacak.
Tabii eklemek gerekir bazen dışbükey olmayan fonksiyonlar için altgradyan hesa-
planamaz, ya da mevcut değillerdir. Her problemi çözmek için bir yemek tarifi
değil bu. Mesela başta gördüğümüz içbükey fonksiyon,
6
problemini çözmek istiyoruz, diyelim f dışbükey ve türevi alınabilir. Bu problem
için x’in çözüm olmasının şartı
∇f(x)T (y − x) > 0 ∀y ∈ C
0 ∈ ∂(f(x) + IC (x))
⇐⇒ 0 ∈ ∇f(x) + NC (x)
olmalı, ya da
⇐⇒ −∇f(x) ∈ NC (x)
7
olmalı. Şimdi normal koniyi hatırlayalım, tanımı
NC (x) = {g ∈ Rn : gT x > gT y ∀y ∈ C
olarak açılabilir. Ya da
⇐⇒ ∇f(x)T (y − x) > 0 ∀y ∈ C
Üstteki 1. derece optimallik şartına benziyor zaten. −∇f(x) üstteki tanımın bir
öğesidir, o zaman 0 altgradyan kümesinin öğesidir.
İşte gayet temiz bir şekilde optimallik ispatı yapmış olduk. Bu arada sınırlama
içeren optimizasiyon problemi için alttaki tanım
0 ∈ ∂f(x) + Nc
ifadesi her nasılsa tamamen genel, yani dışbükey bir problem tanımı için gerekli
ve yeterli bir şart çünkü hatırlarsak bahsettik ki tüm dışbükey problemleri (2) ya
da (3) formunda öne sürmek mümkün. Tabii üstteki formlea iş yapmak kolay
değildir, çünkü NC ile çalışmak zor. Eğer C çetrefil bir küme ise, mesela
C = {x : gi (x) 6 0, Ax = b}
gibi, o zaman normal koniyi oluşturmak zor olacaktır. Yani iki üstteki tanımın her
zaman faydalı olduğunu söyleyemeyiz, ama her dışbükey problem için gerekli ve
yeterli şart olduğunu söyleyebiliyoruz.
Sonradan optimalliği tanımlamanın farklı bir yolunu göreceğiz. Sınırlama ifadeleri
olduğu zaman problemler daha az çetin / çözülür hale gelir, problemler sınırsız-
sınırlı halde birbirine eşit şekilde tanımlanabilirler, ama sınırlı tanımları çözmek
daha kolay. KKT koşulları burada devreye girecek. Yani her şeyi kritere tıkmak,
gösterge vs ile uğraşmak, altgradyan almak yerine bu tür tanımla çalışmak daha
rahat oluyor [2, 12:00].
Altgradyan optimalliğinin bazı diğer örneklerini görelim, mesela Lasso için alt-
gradyan optimalliği. Bazılarının bilebileceği üzere Lasso problemini parametrize
etmenin iki yolu vardır, birisi katsayılar üzerinde bir L1 norm kısıtlaması tanımlamak,
diğeri ise alttaki gibi onu kritere dahil etmek,
1
min ||y − Xβ||22 + λ||β||1 (5)
β 2
8
ki λ > 0. Altgradyan optimalliğinde sadece ve sadece alttaki şart geçerliyse elim-
izde bir çözüm var diyebiliyoruz, bu şart,
1
||y − Xβ||22 + λ||β||1
0∈
2
⇐⇒ XT (y − Xβ) = λv (4)
herhangi bir v ∈ ∂||β||1 için. L1 norm’un altgradyanı için daha önce gördüğümüz
üzere bileşen bileşen bakmak gerekiyor, ve farklı şartlara göre parçalı bir fonksiyon
elde edeceğiz,
{1} eğer βi > 0
vi ∈ {−1} eğer βi < 0
[ − 1, +1] eger βi = 0
Yeni öyle bir β arıyorum ki herhangi bir v vektörü için (4)’u tatmin edecek ve bu
v geçerli bir altgradyan olacak, yani üstteki şartlara uyacak. O zaman çözüme
erişmişim demektir. Çözümü şu anda vermiyoruz, bunlar çözüm için uyulması
gereken optimallik şartları [2, 15:24].
Her βi için üstteki denklemin nasıl oluşacağını görmek istersek, ve X1 , .., Xp değerleri
X matrisinin kolonları olacak şekilde
T
↑ ↑ ↑ ↑
y β1 v1
.1
X1 X2 . . . .. − X1 X2 . . .
.. = λ ..
. .
yp βp vp
↓ ↓ ↓ ↓
O zaman bunu her vi olasılığı için yazarsak, βi ’in sıfır olup olmadığı üzerinden
bir parçalı fonksiyon ortaya çıkartabiliriz. Altgradyan optimallik şartı,
XTi (y − Xβ) = λ · sign(βi ) eger βi 6= 0
|XTi (y − Xβ)| 6 λ eger βi = 0
9
haline geldi. İkinci satırı nasıl elde ettik? Eğer βi = 0 ise bu bana λv ifadesi −λ
ve +λ arasında herhangi bir yerde olabilir diyor (çünkü vi parçalı fonksiyonunda
βi = 0 ise vi -1 ve +1 arası herhangi bir değer dedik), ve −λ ve +λ arası olma
durumunu son satırdaki mutlak değer ifadesine tercüme edebiliriz.
Dikkat, üstteki ifade optimalliğe bakma / kontrol etmek için bir yöntem. Birisi
size bir vektör veriyor [2, 16:57], sonra soruyor “bu vektör Lasso kriterine göre
optimal midir?” Öyle olup olmadığına bakmak için vektörün her ögesine bakıyoruz,
ve üstteki kontrolü işletiyoruz. Eğer her öge optimal ise evet diyoruz, tek bir öğe
bile optimal değilse hayır diyoruz.
Üstteki parçalı formüldeki ikinci bölümü ilginç bir şekilde kullanabiliriz. Diyelim
ki 100 değişkenlik modeli Lasso ile veriye uydurduk, ve β katsayıları elde ettik,
bir regresyon yaptık yani. Diyelim ki çözümden sonra birisi geliyor size 101.
kolon veriyor, acaba tüm uydurma işlemini baştan tekrar mı yapmak lazım? Belki
hayır, |XT101 (y − Xβ)| 6 λ kontrolünü yaparız, eğer koşul doğru ise o zaman β100 =
0 demektir, ve bu katsayıya gerek yoktur, modelin geri kalanı değişmeden kalır
[2, 20:42].
Bir diğer ilginç uygulama Lasso’nun basitleştirilmiş hali; X = I yani birim matrisi
olduğu durum. Bu yaklaşımla bazılarının gürültü silme (denoising) dediği işlemi
yapabilmiş oluyoruz. X = I deyince Lasso’da geri kalan,
1
min ||y − β||22 + λ||β||1
β 2
Bu problem ifadesi diyor ki “öyle bir β vektörü bul ki y’ye olabildiği kadar yakın
olsun ve β üzerinde bir L1 cezası olsun”. Yana bana içinde bir sürü gözlem nok-
tası taşıyan bir y veriliyor ve ben bu gözlemleri en iyi şekilde yaklaşıklayan β’yi
arıyorum ve bu β’nin seyrek olmasını [2, 24:23] tercih ediyorum (L1 cezası ile
bu oluyor, büyük değerler cezalandırılınca çözü katsayının sıfıra yakın olmasını
özendirmiş oluruz). Artık biliyoruz ki üstteki problemi altgradyan optimalliği ile
çözmek mümkün.
Daha önce gördüğümüz Lasso altgradyan optimalliğini X = I için tekrar yazarsak
(y − βi ) = λ · sign(βi ) eger βi 6= 0
||y − βi || 6 λ eger βi = 0
10
β = Sλ (y) diyerek alttakilerin doğru olup olmadığına bakarız,
Eğer yi > λ, βi = yi − λ > 0 ise yi − βi = λ = λ · 1 mı?
Eğer yi < −λ ise benzer şekilde
Eğer |yi | > λ, βi = 0 ise |yi − βi | = |yi | > λ mi?
[distance to convex set örneği atlandı]
Daha önce gradyan inişi (gradient descent) algoritmasını görmüştük, bu algo-
ritma çok basittir. Şimdi işleri biraz daha zorlaştıracağız [2, 48:00]. Bu metotun
bir dezavantajı optimize edilen f’nin türevi alınabilir bir fonksiyon olma zorun-
luluğu. Diğer bir dezavantaj yakınsamanın uzun zaman alabilmesi.
Altgradyan Metodu
Gradyan inişi yapısına benziyor, f’in dışbükey olması ve dom(f) = Rn olması
lazım, ama f’nin pürüzsüz olma zorunluluğu yok.
Gradyan inişi gibi özyineli bir şekilde, x(0) ’dan başlıyoruz, ve
adım atarak ilerliyoruz, öyle ki g(k−1) ∈ ∂f(x(k−1) ) yani f’nin x(k−1) noktasındaki
herhangi bir altgradyanı. Adım ata ata gidiyorum, her adımda mevcut altgradyan-
lara bakıyorum, herhangi birini seçiyorum, ona g(k−1) diyelim, ve x’i bu yönde
olacak şekilde bir tk ’ye oranlı olarak güncelliyorum [2, 49:50].
Altgradyan metotunun ilginç özelliklerinden biri her adımda iniş yapmanın garanti
olmaması (herhalde onun için “altgradyan inişi” yerine “altgradyan metotu” ismi
verilmiş). Bu sebeple adım atarken o ana kadar, yani x(0) , .., x(k) içinde olan en iyi
(k)
(best) (en minimal) noktayı hatırlamak gerekiyor, xbest , ki
(k)
f(xbest ) = min f(x(i) )
i=0,..,k
11
Altgradyan metotunun yakınsama analizi gradyan inişinin analizinden biraz farklı
[2, 54:15]. Diyelim ki elimizde bir dışbükey fonksiyon f var ve tanım kümesi
herşey, dom(f) = Rn . Fonksiyon ayrıca Lipschitz sürekli, fonksiyonun sürekli
olduğunun söylemiyoruz dikkat, fonksiyon sabit G > 0 üzerinden Lipschitz
sürekli, yani
Bunu baz alarak iki tane teori öne sürebiliriz, birisi sabit adım büyüklüğü, diğeri
azalan adım büyüklüğü için.
Yokolan adım büyüklüğü için iki şart tanımlayalım, “kare toplanabilir ama toplan-
abilir değil”, yani şu iki şart,
X
∞ X
∞
t2k < ∞, tk − ∞
k=1 k=1
(k)
lim f(xbest ) 6 f∗ + G2 t/2
k→∞
Üstteki ifade diyor ki eğer altgradyan metotunu sonsuza kadar işletirsek eldeki
en iyi noktadan elde edilecek fonksiyon değeri gerçek optimum artı Lipschitz
sabitinin karesi çarpı t/2’dan küçük olacaktır, ki t sabitlenmiş adım büyüklüğü.
Ama üstteki yine de çözüm için bir limit vermiyor. Onun için alttaki lazım,
Teori 2
Yokolan adım büyüklükleri için
(k)
lim f(xbest ) = f∗
k→∞
X
n
−yi xTi β + log(1 + exp(xTi β)
f(β) =
i=1
12
Üstteki pürüzsüz ve dışbükey bir fonksiyon.
X
n
∇f(β) = (yi − pi (β))xi
i=1
1X T
N
min F(w) = (x w − yi )2 + λ||w||1
w 2 i=1 i
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def subgrad(w):
return X.T*(X*w-y) + lamda*np.sign(w)
def obj(w):
r = X*w-y;
return np.sum(np.multiply(r,r))/2 + lamda * np.sum(np.abs(w))
N = 40
dim = 10
max_iter = 200
lamda = 1/np.sqrt(N);
np.random.seed(50)
w = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim))).T
X = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim), size = N))
y = X* w
w = np.matrix([0.0]*dim).T
obj_SD = []
gamma = 0.01
for t in range(0, max_iter):
obj_val = obj(w)
13
w = w - gamma * subgrad(w)/np.sqrt(t+1)
obj_SD.append(obj_val.item())
if (t%5==0): print('iter= {},\tobjective= {:3f}'.format(t, obj_val.item()))
print (w)
14
Bir diğer örnek [4]’ten, burada kodlanan (5)’teki formül aslında, kodun sembol-
lerini kullanırsak,
1
min ||Ax − b||2 + λ||x||1
x 2
L1 normu ||x||1 gradyan inişi için problemli o sebeple altgradyan metotu kul-
lanacağız. Veri olarak [5]’te görülen diyabet verisini alabiliriz,
def subgrad_func(A,b,lam):
n2 = A.shape[1]
x = np.zeros((n2,1))
k=1
g = np.ones((n2,1))
t = 0.01
f = []
while True:
if k>3:
crit = np.abs(f[k-2]-f[k-3])/f[k-2]
if crit < 1e-5: break
tmp = 0.5*lin.norm(np.dot(A,x)-b,2)**2+lam*lin.norm(x,1);
if k%10==0: print (tmp)
f.append(tmp)
s = x.copy()
s[x>0]=1
s[x<0]=-1
if len(s[x==0])>0:
s[x==0] = -2*np.random.rand(len(x==0))+1
g = np.dot(A.T,np.dot(A,x)-b) + lam*s
x = x - t*g
k = k+1
return x
diabetes = pd.read_csv("../../stat/stat_120_regular/diabetes.csv",sep=';')
y = np.array(diabetes['response'].astype(float)).reshape(442,1)
A = np.array(diabetes.drop("response",axis=1))
lam = 0.1;
x = subgrad_func(A,y,lam);
print ('x')
print (x)
6167530.253256479
6017359.332614086
5936043.378499364
5887955.958919385
5856837.417105291
5835069.931049544
15
5818932.590413047
5806489.16976122
5796653.745550204
5788760.388544399
5782366.953999686
5777155.717300746
5772889.40103409
5769385.329280358
5766499.620202982
5764117.531938736
5762146.838816163
5760513.025122407
5759155.660694774
5758025.5987459235
5757082.775086282
5756294.462375693
5755633.876252789
x
[[ 5.34807751]
[-200.87752927]
[ 490.9420537 ]
[ 304.14877939]
[ -43.03872491]
[-107.97583692]
[-207.47086585]
[ 127.15527296]
[ 410.70880916]
[ 115.41867007]]
Bir dışbükey kümesi üzerinden tanımlı ama pürüzsüz olmayabilecek bir dışbükey
fonksiyonu minimize etmek için yansıtılan altgradyan (projected subgradient)
metotu adlı bir metot ta kullanılabilir [2, 22:04].
Dışbükey f’yi dışbükey küme C üzerinden optimize etmek için
(k−1)
x(k) = PC x(k−1) − tk gk
Bu metot normal altgradyan metotu gibi, tek fark parantez içinde görülen alt-
gradyan adımı atıldıktan sonra elde edilen sonucun C kümesine geri yansıtılması
(projection), çünkü atılan adım sonucunda olurlu bir sonuç elde etmemiş olabili-
riz.
Yakınsama analizi normal altgraydan metotuna benziyor, bu metotla da benzer
yakınsama garantisi elde edilebiliyor, yakınsama oranı da buna dahil.
Yansıtma adımı bazen zor olabilir, hangi durumlarda kolay olduğunun listesi
aşağıda [2, 23:53]. Hangi kümelere yansıtmak kolaydır?
1) Doğrusal görüntüler: {Ax + b : x ∈ Rn }
16
2) {x : Ax = b} sisteminin çözüm kümesi
3) Negatif olmayan bölge: Rn + = {x : x > 0}. Verilen vektörün negatif değerlerinin
sıfır yapmak, pozitifleri tutmak bize o vektörün negatif olmayan bölge karşılığını
veriyor.
4) Bazı norm topları {x : ||x||p 6 1}, p = 1, 2, .., ∞ için. Daha önce 2-norm topuna
yansıtmayı gördük, vektörü alıp normalize edersek bu kümeye yansıtma yapmış
oluyoruz aslında. Bu yansıtma bizi o vektörün 2-norm topundaki en yakın diğer
vektöre götürüyor. Sonsuz norm kolay, bir kutuya yansıtma yapmış oluyoruz,
bunun ne demek olduğunu düşünmeyi size bırakıyorum, 1-norm en zoru.
5) Bazı çokyüzlüler (polyhedra) ve basit koniler.
Bir uyarıda bulunalım, tanımı basit duran kümeler ortaya çıkartmak kolaydır,
fakat bu kümelere yansıtma yapan operatörler çok zor olabilir. Mesela gelişigüzel
bir çokyüzlü C = {x : Ax 6 b} kümesine yansıtma yapmak zordur. Bu problemin
kendisi apayrı bir optimizasyon problemi aslında, bir QP.
[stochastic subgradient method atlandı]
Altgradyanların iyi tarafı genel uygulanabilirlik. Altgradyan metotları dışbükey,
Lipschitz fonksiyonları üzerinde bir anlamda optimaldir. Ünlü bilimci Nesterov’un
bu bağlamda bir teorisi vardır [2, 45:12], pürüzsüz durumlarda ve 1. derece
yöntemlerde altgradyanların lineer kombinasyonları üzerinden güncellemenin
sonucu olan adımların başarısına bir alt sınır tanımlar.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 6, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Video 7, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] He, IE 598 - BIG DATA OPTIMIZATION, http://niaohe.ise.illinois.
edu/IE598_2016/
[4] Feng, Lasso, https://github.com/fengcls/Lasso
[5] Bayramlı, Istatistik, Regresyon, Ridge, Lasso, Çapraz Sağlama, Regülarize Etmek
17
Proksimal / Yakınsal Gradyan Metotu (Proximal Gradient Method)
Bu metot, herhangi bir pürüzsüz olmayan fonksiyonu optimize etmeye uğraşmak
yerine belli bir yapıya uyan çetrefil fonksiyonları optimize etmeye uğraşır. Bu
yapı
formundadır [1, 45:59]. g, h’in ikisi de dışbükey. g’nin pürüzsüz, türevi alınabilir
olduğu farz edilir (çoğunlukla oldukca çetrefil olabilir) ve dom(g) = Rn , h ise
pürüzsüz olmayabilir. Tabii pürüzsüz artı pürüzsüz olmayan iki fonksısyon toplamı
kriterin tamamını pürüzsüz olmayan hale çevirir. Ama bu toplam daha basittir
denebilir, onun üzerinde proksimal operatörü uygulanabilir.
Hatırlarsak eğer f türevi alınabilir olsaydı gradyan iniş güncellemesi
x+ = x − t · ∇f(x)
1
x+ = arg min f(x) + ∇f(x)T (z − x) + ||z − x||22
x
| {z 2t }
ft (z)
elde ediliyordu. Yani gradyan inişi sanki ardı ardına geldiği her noktada bir kare-
sel yaklaşıklama yapıyor, ve onu adım atarak minimize etmeye uğraşıyor.
Ama (1)’deki f pürüzsüz değil, o sebeple üstteki mantık ise yaramayacak. Fakat,
belki de karesel yaklaşıklamanın bir kısmını hala kullanabiliriz, ve minimizasy-
onu sadece g’ye uygularız çünkü pürüzsüz olan kısım o. Yani niye g’nin yerine
karesel yaklaşıklama koymayalım? Şimdi bunu yapacağız [1, 50:10].
ki g̃t (z) g’nin x noktası etrafındaki karesel yaklaşıklaması oluyor. Eğer elimizde
h olmasaydı üstteki sadece bir gradyan güncellemesine indirgenebilirdi. Neyse
açılımı yaparsak
1
= arg min g(x) + ∇g(x)T (z − x) + ||z − x||22 + h(z)
z 2t
Daha uygun bir formda yazabiliriz, z’nin g üzerindeki değişikliğe karesel uzaklığı
olarak,
1
1 2
= arg min z − x − t∇g(x) 2 + h(z)
z 2t
Yani söylenmek istenen, hem sadece g olsaydı atacağımız gradyan adımına yakın
durmaya çalışmak, hem de h’nin kendisini ufak tutmak. Dışarıdan ayarlanan t
parametresi g gradyan adımı ile h arasında bir denge kurmak gibi görülebilir,
eğer t ufak ise o zaman gradyan adımına yakın durmaya daha fazla önem atfetmiş
olacağız, h’nin ufak tutulmasına daha az. t çok büyük ise tam tersi olacak.
Bu aslında kabaca Proksimal Gradyan İnişi yöntemini tarif etmiş oluyor. Şimdi
proksimal eşlemesi operatörünü göstereceğiz, ki bu algoritmaları daha temiz olarak
yazmamıza yardımcı olacak.
Bir h fonksiyonu için bir prox operatörü tanımlıyoruz,
1
proxt (x) = arg min ||x − z||22 + h(z) (3)
z 2t
Üstteki x’in bir fonksiyonu olarak arg min’de gösterilen kriteri minimize eden
z’yi buluyor. Operatör t’ye bağlı, dışarıdan verilen parametre. Tabii ki h’ye de
bağlı, ki bazen üstteki operatörü proxh,t olarak gösteren de oluyor.
Üstteki ifadenin eşleme olduğunu kontrol edelim. Ciddi tanımlı bir fonksiyon
üstteki değil mi? Ona bir x veriyorsunuz, o da size tek bir sonuç döndürüyor.
Ayrıca bu eşleme / fonksiyonun kendisi bir minimizasyon. Peki bu minimiza-
syon problemi dışbükey mi? Evet. Peki bu problemin özgün bir sonucu var
mıdır? Vardır çünkü üstteki problem harfiyen dışbükey. Değil mi? Eğer h harfiyen
dışbükey olmasa bile ifadenin tümü harfiyen dışbükey olurdu çünkü 2t 1
||x − z||22
harfiyen dışbükey [1, 55:09], z−x’in karesi var [ayrıca x değişkeni h’ye geçilmiyor].
Yani harfiyen dışbükey, o zaman özgün sonuç var. Biz de bu özgün sonucu alarak
bir iniş algoritması yazıyoruz [1, 56:28],
x − proxt (x − t∇g(x))
Gt (x) =
t
G’nin dışbükey fonksiyonların alışılageldik gradyanlarına benzer pek çok özelliği
vardır, ki bu özellikler proksimal metotların yakınsadığıyla alakalı ispatlarda kul-
lanılabilir.
2
Şimdiye kadar anlattıklarımıza bakanlara bu komik bir hikaye gibi gelebilir. Bir
g + h toplamını minimize etmek istiyordum, bunu yapabilmek için (2) formunda
adımlar atacağım, bir prox operatörüm var, ama bu operatör bir sonuç döndürüyor
aslında, ve bu sonuç bir başka minimizasyondan geliyor. Yani g + h türü bir
toplam minimizasyonu yerine her adımda, bir sürü minimizasyonları koymuş
oldum. Bu nasıl daha iyi bir sonuç verecek ki?
Şunu belirtmek lazım, sadece eğer proksimal gradyanları analitik, ya da hızlı bir
şekilde hesaplayabiliyorsak onları çözüm için düşünürüz. Yani her ne kadar her
adımda (3) turu optimizasiyonlar yapıyorsak ta, bunu pürüzsüz olan kısım h
yeterince basit olduğu zaman yapıyoruz ki tüm (3) için analitik ya da hızlı hesap-
sal çözüm olsun [1, 58:54].
Diğer noktalar, dikkat edersek proksimal operatör g’ye bağlı değil, tamamen h
bazlı. Eğer h basit ise ama g müthiş çetrefil ise bu proksimal hesaplarını çok
zorlaştırmıyor. Eğer o çok çetrefil (ve pürüzsüz) g için gradyan hesaplanabiliy-
orsa, durumu kurtardık demektir.
Tekrar bir Lasso problemi göreceğiz. Bu Lasso için gördüğümüz ikinci algoritma,
ve belirtmek gerekir ki Proksimal metot altgradyan metotuna göre çok daha ver-
imlidir, hızlıdır.
Verili bir y ∈ Rn , X ∈ Rn×p için Lasso kriterini hatırlarsak,
1
f(β) = ||y − Xβ||22 + λ||β||1
2
Kriterdeki ilk terim en az kareler kayıp fonksiyonu, ikinci terim bir ayar parame-
tresi üzerinden katsayıların 1. normu. Bu kriteri pürüzsüz, ve pürüzsüz olmayan
ama basitçe olan iki kısma ayıracağız, yani zaten oldukca bariz, pürüzsüz kısım 1.
terim, g(β) diyelim, olmayan 2. terim, h(β) diyelim. Proksimal gradyan inişi için
bize iki şey gerekiyor, birincisi g’nin gradyanı, ikincisi h için prox operatörünü
hesaplayabilmek.
g’nin gradyanı oldukca basit, onu bu noktada uykumuzda bile bulabiliyor ol-
mamız lazım. h’nin prox operatörü,
1
proxt (β) = arg min ||β − z||22 + λ||z||1
z 2t
Her şeyi t ile çarparsam,
1
proxt (β) = arg min ||β − z||22 + λt||z||1
z 2
= Sλt (β)
3
Yine yumuşak eşikleme (soft-threshold) operatörüne gelmiş olduk,
βi − λ eğer βi > λi
[Sλ (β)]i = 0 eğer − λ > βi > λ, i = 1, .., n
βi + λ eğer βi < −λi
Tüm algoritma neye benziyor? Önce g’ye göre bir graydan güncellemesi ya-
parım, gradyan
O zaman güncelleme
β + tXT (y − Xβ)
Yumuşak eşikleme ne yapar? Her ögeye teker teker bakar, eğer mutlak değeri
çok ufaksa onu ya sıfıra eşitler, ya da onu λ · t kadar sıfıra yaklaştırır.
Üstteki Lasso algoritmasina ISTA adı da verilir.
Geriye Çizgisel İz Sürme (Backtracking line search)
Graydan inişinde görmüştük ki adım büyüklüklerini dinamik olarak seçebiliyorduk,
her adımdaki duruma adapte olabiliyorduk, tipik olarak Lipschitz sabitini bilmiy-
oruz çünkü. O sebeple geriye iz sürme pratikte iyi işlemesiyle beraber, teorik
olarak yakınsamayı da garantiliyordu.
Proksimal gradyanları için benzer bir kavram geçerli. Ayrıca proksimal durumda
geriye doğru iz sürmenin birden fazla yolu var [1, 1:10:23]. Ben sadece g üzerinde
işlem yapan bir yöntem seçtim, çünkü bu metotu hatırlaması daha kolay. Gradyan
inişi için iz sürmeyi hatırlarsak, x noktasındayız diyelim ve x − t∇g yönünde git-
mek istiyoruz, o zaman alttakinin doğru olup olmadığını kontrol ediyorduk,
t
f(x − t∇f(x)) > f(x) − ||∇f||22
2
Proksimal gradyan için benzer bir yöntem [1:11:57], ve G üzerinde işlem yapıyoruz
dikkat, h değil, yani G üzerinden yeterince “iniş” yapmaya uğraşacağız, g + h
değil. Normal iz sürmede üsttekinin doğruluğunu kontrol ediyoruz, doğru ise
t’yi belli bir ölçüde ufaltıyoruz. Doğru değilse yani yeterince iniş yaptıysak, o
zaman eldeki değerlerle güncellemeyi yapıyoruz.
4
t
g(x − tGt (x)) > g(x) − t∇g(x)T Gx (x) + ||Gx (x)||22
2
1 X
min (Yij − Bij )2 + λ||B||tr (4)
B 2
(i,j)∈ω
X
r
||B||tr = σi (B)
i=1
ile gösterilir, r kertedir, r = rank(B), ve herhangi bir X matrisi için σ1 (X) > .. >
σr (X) > 0, X’in eşsiz (singular) değerleridir.
Minimizasyon ifadesindeki ilk toplam, B’deki değerleri zaten görülen, bildiğimiz
değerlere Y’ye karesel kayıp yakın tut diyor, ve ona bir ayar parametresi üzerinden
B’nin iz normunu ekliyoruz, bu istatistiki bağlamda bir tür regülarizasyon yapmış
oluyor. Eğer bu ek olmsaydı problem kötü konumlanmış (ill-posed) olurdu [3,
15:06]. Eğer o terim olmasaydı ve λ sıfır olsaydı o zaman optimizasyon B’yi Y’ye
5
eşitlerdik, oldu bitti derdik, ama o zaman hiçbir iş yapmamış olurduk. Sağdaki
terim ekiyle yapmaya uğraştığımız Y’ye olabildiğince yakın bir B seçmek ve bu
B’nin düşük kerte olmasını zorlamak. Bu bir regülarizasyon yöntemi, diyelim B
şu şekilde
B = |{z}
|{z} VT
U |{z}
m×n m×k k×n
yani B’yi güya oluşturan birer U, V’nin boyutlarındaki k’nin olabildiğince düşük
olmasını istiyoruz.
Bir diğer bakış açısı, daha önceki Lasso’yla ilintilendirmek bağlamında, iz normu
L1-normun matrisler için olan versiyonu olarak görmek. Eğer elimde bir köşegen
matris olsaydı iz köşegendeki öğelerin (tek öğeler onlar) toplamı olurdu, ki bu
bir vektörün 1-norm’unu almak gibi değil mi? Eğer köşegeni bir vektör gibi
görürsem, ve matriste bu vektörden başka bir şey yoksa.. bağlantıyı görüyoruz
herhalde.
Bir anlamda ||B||tr B matrisinin kertesini yaklaşıksal olarak temsil ediyor çünkü
kerte bir matrisin sıfır olmayan eşsiz değerlerinin sayısıdır. ||B||tr tabii ki eşsiz
değerlerinin sayısı değil onların kendilerinin toplamı, ama yaklaşıksal olarak kul-
lanabileceğimiz bir şey bu y [3, 17:49] , çünkü değer toplamı dışbükey [altgradyan,
türevi alınabildiği için bu yaklaşıklık seçilmiş herhalde]. (4) problemi tamamen
dışbükey bu arada, ilk terim dışbükey, ve ikinci terim düzgün bir norm’dur o
zaman dışbükeydir.
Bilimciler proksimal gradyan kullanmadan önce bu problem zor bir problemdi.
Optimizasiyon problemi bir yarı kesin (semidefinite) program olarak tanımlanır.
Eskiden bu tür problemleri iç nokta teknikleri ile çözüyorduk, ve bu teknikler
üstteki gibi problemler üzerinde oldukca yavaştır.
Devam edelim, problemi şöyle hazırlarız, bir yansıtma operatörü PΩ tanımlayalım,
gözlenen kümeye yansıtma yapacağız,
Bij (i, j) ∈ Ω
[PΩ (B)]ij =
0 (i, j) ∈
/Ω
Bu operatörün yaptığı verilen bir matrisin gözlem olmayan her öge için değeri
sıfır yapmak, yoksa olduğu gibi bırakmak. Simdi kriteri yazabiliriz,
1
f(B) = ||PΩ (Y) − PΩ (B)||2F + λ||B||tr
|2 {z } | h(B)
{z }
g(B)
6
gradyan hesaplayabilmek, ve pürüzsüz olmayan kısım için prox operatörünü
hesaplayabilmek. Gradyan oldukca basit,
1
proxt (B) = arg min ||B − Z||2F + λ||Z||tr (5)
Z 2t
Tüm mümkün Z matrisleri üzerinden minimizasyon yapıyoruz, ve Bi ile Zi arasındaki
tüm farkların kare toplamlarını alıyoruz, artı bir sabit çarpı Z’nin iz normu. Yani
optimizasyon hedefi Z, ve bu minimizasyonu prox operatörünü B üzerinde uygu-
layarak elde ediyoruz [3, 22:15].
Üstteki ifadeyi hesaplamak için altgradyan matematiğine inmek gerekiyor biraz.
Yani prox’u λ seviyesinde bir matriste yumuşak eşikleme olarak görmek mümkün.
Yani aynen 1-norm’un prox operatörünün vektörsel yumuşak eşikleme olduğu
gibi burada matris seviyesinde bir eşikleme var [3, 22:46]. Bu demektir ki her-
hangi bir matris B’nin prox operatörü için B’nin SVD’sini alıyoruz, yani B =
UΣV T diyoruz, ve köşegen matris Σ üzerinde yumuşak eşikleme işletiyoruz, bunu
yapmak için ya köşegendeki her ögeden λi çıkartıyoruz ve eğer pozitifse o değeri
kullanıyoruz, ya da sıfır alıyoruz.
Sλ (B) = UΣλ V T
Sλ (B) normal B’den daha düşük kerteli olacaktır, çünkü üstteki işlem ile Σλ ’nin
köşegenindeki bazı değerler sıfırlanır, ve bu matris ile hesaplanan UΣλ V T , çarpım
sırasında U, V’deki bazı satırlar, kolonları da sıfırlar [3, 26:00].
Peki proxt (B) = Sλt (B) nereden geliyor? Prox operatörünü oluşturan kriterin
(5) altgradyanını alırız, sıfıra eşitleriz, ve ortaya çıkan formülü doğrulayan Z’yi
buluruz. Cevabın ne olacağını biliyoruz, sadece tarif edilen altgradyan vs sonrası
aynı formülü bulup bulmayacağımızı kontrol edeceğiz.
(5)’teki ilk terim puruzsuz, direk gradyan alinir,
0 ∈ Z − B + λt · ∂||Z||tr (7)
7
İz normunun altgradyanını gösterelim,
Üstteki notasyon diyor ki aradığımız W’ler en büyük eşsiz değeri 1’den küçük
olan ve U’nun kolonlarına ve W’nin satırlarına dikgen olmalı. Yıne sonradan
doğrulama ile ispat yapılabilir, üstteki tanımı baz alarak Z = Sλt (B) olarak formüle
sokarsak sıfır sonucu aldığımızı göreceğiz. Ek bazı bilgiler, iz normu ve op normu
birbirinin ikizidir. Yani
||Z||tr = max Z · Y
||Y||op 61
= max tr(ZT Y)
||Y||op 61
Büyük parantez içini gradyan ile hesaplıyoruz sonra elde edileni yumuşak eşikten
8
geçiriyoruz. Bu ne demekti? Parantez içindekilerin SVD’sini al, eşsiz değeri
λt’den küçük olan tüm değerleri sıfırla, ve kalanlardan λt çıkar, ve bu yeni değerlerle
yeni bir matris yarat. Prox operatörünü uygulamak bu demek.
Bu arada pürüzsüz kısmımızdaki gradyan ∇g(B), L = 1 ile Lipschitz süreklidir.
(8)’deki ifade lineer, sabit 1 üzerinden tabii ki Lipschitz. Yakınsama analiz bil-
gimiz bize diyor ki proksimal gradyan inişinde adım büyüklüğü en fazla 1/L
olabilir, ki burada 1 sadece. Bu problemin güzel taraflarından biri bu, olabilecek
en büyük adım büyüklüğünü kullanabiliyoruz ve onu hesaplaması kolay, sadece
1.
Ve t = 1’i üstteki formüle sokuyoruz,
+
B = Sλt B + PΩ (Y) − PΩ (B)
9
işletmemiz lazım, bu İSTA’dan farklı. SVD oldukca pahalı bir işlemdir, özellikle
büyük matrisler için.
[atlandi]
Matris tamamlama böyle. Şimdi proksimal gradyan inişine kategorik olarak bakalım,
PGİ gradyan inişinin genelleştirilmiş halidir dedik. f = g+h kriterini çözüyorsak,
h = 0 ise normal gradyan inişini elde ederiz.
h = IC ise yansıtılan gradyan inişini elde ederiz.
g = 0 ise proksimal minimizasyon algoritmasini elde ediyoruz. Bu durumda
kriterde sadece pürüzsüz olmayan bir fonksiyon var, bu algoritma altgradyan
inişine bir alternatif olarak kullanılabiliyor.
Tabii üstteki tüm özel durumların da yakınsama oranı O(1/). Bunu biliyoruz
çünkü proksimal gradyanin teorik yakınsama oranı öyle [3, 48:30].
Ekler
Örnek kod, Lasso problem çözümü [2], pür proksimal gradyan inişi, iz sürme
yok
import pandas as pd
diabetes = pd.read_csv("../../stat/stat_120_regular/diabetes.csv",sep=';')
y = np.array(diabetes['response'].astype(float)).reshape(442,1)
X = np.array(diabetes.drop("response",axis=1))
N,dim = X.shape
print (N,dim)
lam = 1/np.sqrt(N);
w = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim))).T
L = (np.linalg.svd(X)[1][0])**2
print(L)
max_iter = 500
def obj(w):
r = X*w-y;
return np.sum(np.multiply(r,r))/2 + lam * np.sum(np.abs(w))
def f_grad(w):
return X.T*(X*w-y)
def soft_threshod(w,mu):
return np.multiply(np.sign(w), np.maximum(np.abs(w)-mu,0))
w = np.matrix([0.0]*dim).T
for t in range(0, max_iter):
obj_val = obj(w)
w = w - (1/L)* f_grad(w)
w= soft_threshod(w,lam/L)
if (t % 50==0):
print('iter= {},\tobjective= {:3f}'.format(t, obj_val.item()))
10
print (w)
442 10
4.0242141761466925
iter= 0,objective= 6425460.500000
iter= 50,objective= 5751070.568959
iter= 100,objective= 5750285.357193
iter= 150,objective= 5749670.506866
iter= 200,objective= 5749177.635558
iter= 250,objective= 5748779.527464
iter= 300,objective= 5748457.810485
iter= 350,objective= 5748197.804952
iter= 400,objective= 5747987.670443
iter= 450,objective= 5747817.840900
[[ -8.71913404]
[-238.35531517]
[ 522.93302022]
[ 323.11825944]
[-526.09642955]
[ 265.58097894]
[ -17.84381222]
[ 143.15165377]
[ 652.14114865]
[ 68.55685031]]
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 8, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] He, IE 598 - Big Data Optimization, http://niaohe.ise.illinois.edu/
IE598_2016/
[3] Tibshirani, Convex Optimization, Lecture Video 9, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
11
Newton-umsu Metotlar (Quasi-Newton Methods), DFP, BFGS
Bir f hedef fonksiyonunun minimizasyonu için Newton metodunun özyineli al-
goritması
Newton’umsu metotların ana fikri Hessian matrisi yerine sadece gradyan bil-
gisini kullanarak yaklaşık bir Fk kullanmak, diyelim ki Hk . Sonra f(·)’un karesel
olarak temsilini yazalım, özyineli gidişat sırasında, bir herhangi bir xk+1 etrafında
Taylor açılımı
1
mk (x) ≡ f(xk+1 ) + ∇f(xk+1 )T (x − xk+1 ) + (x − xk+1 )T HTk+1 (x − xk+1 )
2
Şimdi k ve k+1 noktaları, gradyanları üzerinden bir Hk+1 ilişkisi ortaya çıkartmak
istiyoruz ki çözüp bir sonuç elde edebilelim. Ek denklemler elde etmek için şu
akla yatkın şartları öne sürebiliriz, m ve f gradyanları birbirine uysun. Yani,
∇f(xk+1 ) + H−1
k+1 (xk − xk+1 ) = ∇f(xk )
H−1
k+1 (xk − xk+1 ) = ∇f(xk ) − ∇f(xk+1 )
H−1
k+1 (xk+1 − xk ) = ∇f(xk+1 ) − ∇f(xk )
1
Yani sekant denklemine göre H−1
k+1 değeri, yatay kordinattaki x
k+1
−xk değişimini,
gradyan değişimi ∇f(xk+1 ) − ∇f(xk )’e taşıyor / eşliyor [4].
Kısaltma amaçlı,
H−1
k+1 (x − x ) = ∇f(xk+1 ) − ∇f(xk )
| k+1{z k} | {z }
yk sk
H−1
k+1 yk = sk (1)
Hk+1 = Hk + czzT
sk − Hk yk
cz =
z T yk
z = sk − Hk yk
2
1
c=
zT y k
(s − Hk yk )(s − Hk yk )T
Hk+1 = Hk +
(s − Hk yk )yk
sk = Hk yk + c1 z1 (zT1 yk ) + c2 z2 (zT2 yk )
1 1
z 1 = sk , z2 = Hk yk , c1 = , c2 =
zT1 yk zT2 yk
3
xk+1 = xk + αk dk
4) Hesapla
yk = αk dk
sk = gk+1 − gk
BFGS
DFP ile kerte 2 güncellemesi oluyor böylece Hk+1 pozitif kesin kalıyor, güzel.
Fakat DFP’nin hala sayısal olarak bazı problemleri var. Burada problem Hes-
sian’ın değil Hessian’ın tersinin yaklaşıklamasının güncelleniyor olması. Daha
iyi bir seçim Hessian’ın kendisinin yaklaşıklamasının güncellenmesi ve onun üzerinden
bir terslik elde edilmesi olmaz mıydı? Evet.
Devam etmeden önce işimize yarayacak başka bir konu, ikizlik konusundan bahsede-
lim. Eğer DFP formülünün tersinin alırsak belli bir sonuç elde ederiz (bunun
benzerini yapacağız). Ama biz bu noktaya (1)’deki
Hk+1 yk = sk
yk = Bk+1 sk
İşte Bk ’nin BFGS güncellemesi budur, isim Broyden, Fletcher, Goldfarb, and Shan-
non adlı araştırmacılardan geliyor. Şimdi üsttekinin tersini alırsak arka planda
yapılan ve daha stabil olan Hk ’nin güncellenmesinden faydalanmış oluyoruz,
ama hala her adımda bizim ilgilendiğimiz matris tersine erişmiş oluyoruz. Üstteki
4
formülün sağ tarafının tersi için [6]’daki Sherman-Morrison tekniğini kullanacağız.
SM formülü neydi?
sk
A0 = Bk , uo = T
, vT0 = sTk
sk yk
sk sTk Bk yk
A1 = Bk + T
= A0 + u0 vT0 , u1 = −
sk yk yTk Bk yk
vT1 = yTk Bk
Böylece
formülüne erişmiş olduk. Bu Bk+1 üzerinden bir ters elde etmek için, ki bu sonuca
HBFGS
k+1 diyelim,
HBFGS −1
k+1 = Bk+1
SM açılımına göre,
A−1 T −1
1 u1 v1 A 1
= A−1
1 −
1 + vT1 A−1
1 u1
A−1
1 de SM ile açılacak tabii (onun için bu A1 ’i belli bir forma getirdik)
5
Dikkat edersek A0 = Bk . O zaman A−1 0 = B−1
k = Hk . Bu eşitliği ve ilk başta
gösterdiğimiz notasyonu kullanarak,
Hk sk sTk Hk
×(Hk − )
yTk sk + sTk Hk sk
Hk Bk = Bk Hk = In
k k k H s sT
T k k k s sT H
Hk sk sTk Hk (1 − sT yk +sT H s )(−yk yk )(1 − sT y +sT H s )
HBFGS
k+1 = Hk − T T
− k k k k
Ts
k k k k k
sk yk + sk Hk sk T T s k
yk Bk yk + yk (Bk − sT yk +sT Hk sk )(−yk )
k
k k
H s sT yT yT s sT H
Hk sk sTk Hk ( sT ykk+s
k k k k k k k
T H s − yk )(xk − sT y +sT H s )
HBFGS
k+1 = Hk − T T
− k k k k k k k k k
T s sT y
sk yk + sk Hk sk T T y
yk Bk yk − yk Bk yk + sT ykk +sTkHkksk
k
k k
Üstte en son terimdeki bölendeki terimleri iptal edince ve daha fazla çarpma
işlemi yapınca,
6
Dikkat edersek 2. ve 3. terimleri birbirini iptal ediyor, o zaman, ve 4. terimi
alternatif bir formda gösterirsek,
sk yTk sk yTk y k yT
HBFGS
k+1 = I− Hk I − T + T k
s k yk y k sk yk s k
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as lin
eps = np.sqrt(np.finfo(float).eps)
def rosen(x):
return 100*(x[1]-x[0]**2)**2+(1-x[0])**2
def rosen_real(x):
gy =[-400*(x[1]-x[0]**2)*x[0]-2*(1-x[0]), 200*(x[1]-x[0]**2)]
return rosen(x), gy
dphi_curr=dphi_zero
i=0;
while np.abs(dphi_curr)>epsilon*np.abs(dphi_zero):
alpha_old=alpha_curr
alpha_curr=alpha
dphi_old=dphi_curr
y,grad=f(x+alpha_curr*d)
dphi_curr=np.dot(np.array(grad).T,d)
alpha=(dphi_curr*alpha_old-dphi_old*alpha_curr)/(dphi_curr-dphi_old);
i += 1
if (i >= max) and (np.abs(dphi_curr)>epsilon*np.abs(dphi_zero)):
print('Line search terminating with number of iterations:')
print(i)
print(alpha)
break
7
return alpha
H = np.eye(2)
tol = 1e-20
y,grad = func(x)
dist=2*tol
epsilon = tol
iter=0;
while lin.norm(grad)>1e-6:
value,grad=func(x)
p=np.dot(-H,grad)
lam = linesearch_secant(func,p,x)
iter += 1
xt = x
x = x + lam*p
s = lam*p
dist=lin.norm(s)
newvalue,newgrad=func(x)
y = np.array(newgrad)-grad
rho=1/np.dot(y.T,s)
s = s.reshape(2,1)
y = y.reshape(2,1)
tmp1 = np.eye(2)-rho*np.dot(s,y.T)
tmp2 = np.eye(2)-rho*np.dot(y,s.T)
tmp3 = rho*np.dot(s,s.T)
H= np.dot(np.dot(tmp1,H),tmp2) + tmp3
#print ('lambda:',lam)
print (xt)
print ('iter',iter)
x=np.array([-1.0,0])
bfgs(x,rosen_real)
[1. 1.]
iter 19
8
"objective function must "
"return a scalar value.")
grad[k] = df
ei[k] = 0.0
return grad
def rosen_approx(x):
g = _approx_fprime_helper(x, rosen, eps)
return rosen(x),g
bfgs(x,rosen_approx)
[0.99999552 0.99999104]
iter 19
9
Çifteşlik, İkizlik (Duality)
Bu benim en favori konularımdan [1]. Çok faydalı ve çok güzel bir teknik, bakış
açısı. Bu konu üzerinde iki ders zamanı harcayacağız. Konuyu lineer program-
lama (LP) üzerinden göreceğiz, çünkü bu alanda çifteşlik pratik olarak rahatça
gösterilebiliyor.
[önceki ders özeti atlandı]
Önümüzdeki iki ders için teori şapkamızı takacağız, tabii çifteşliğin pek çok opti-
mizasyon problemi üzerinde çok ciddi etkileri var. Yani bu konu bulutlar üzerinde,
aşırı soyut bir konu değil, onu vurgulamak istiyorum.
Ama şimdilik soyut denebilecek bir problemle başlayalım. Diyelim ki elimde
bir LP var ve bu LP’nin optimal değeri için bir alt sınır bulmak istiyorum, B 6
minx f(x). Çifteşliğe bu çok basit soru üzerinden giriş yapacağız. Örnek
min x + y, öyle ki
x,y
x+y>2
x, y > 0
dogru olsun.
İki skalar değişken var, ve pozitif olmalılar. Bu problem için alt sınır nedir?
Çıplak gözle bile bakarak bunu bulabiliriz, cevap 2. Değil mi? x + y > 2 şartına
uymak gerekiyorsa alt sınır 2 olacaktır.
Bazılarınız düşünebilir ki “şanslıydık, problem şartları aradığımız şeyi söylüyordu
zaten”. Doğru fakat iddia ediyorum ki bu stratejiyi metodik bir şekilde de kul-
lanabilirdik. Benzer bir problem,
x+y>2
x > 0, y > 0
1
x+y>2
x, y > 0
Alt sınır nedir? Öncekine göre biraz farklı bir strateji izleyeceğiz, diyelim ki her
şartı a, b, c sabitleri ile çarptım,
ax + ay > 2a
bx > 0
cy > 0
Bu tabii ki a, b, c > 0 ise yapılabilir yoksa işaretler değişirdi. Devam edelim, yine
bazı ek koşullar yaratmış oldum. Bu yeni şartları toplarsam bir yeni şart daha
elde ederim,
px + qy > 2a
atama
a + b = p, a+c=q
Aslında alt sınırı iki üstteki denklemden bulmuş olduk, 2a (bir üstteki şartlara
uyulduğu sürece tabii).
Eğer en iyi alt sınırı isteseydim, onu nasıl elde ederdim? Bu demektir ki 2a ola-
bildiğince büyük olmalı, tabii belli şartlara uyulduğu sürece. Aslında bu soru bizi
ikinci bir LP’ye götürüyor, literatürde ana LP’nin çifteşi / ikizi denen LP’ye. İki
değişkenli ortamda,
max 2a öyle ki
a,b,c
a+b=p
a+c=q
a, b, c > 0
Maksimum arandığına dikkat ve bu problemde üç tane değişken var (ana prob-
lemde iki taneydi). Ve böylece deriz ki üstteki şartlara uyan her a, b, c (ki bu
şartlara ikizin olurluk / fizibilite şartları deniyor) maksimal noktada ana prob-
lemin alt sınırını minimize eder.
2
Bir soru sorayım: acaba üstteki problemden bir eşitlik elde etmem mümkün mü?
Yani ikizdeki problemin optimal değeri ana problemdeki optimal değere eşit ola-
bilir mi? Cevap evet. Peki arada boşluk olması mümkün mü? Cevap (bazen)
evet. İyi bir sezgisel bakış bu, ana ve ikiz LP optimal değerleri neredeyse her
zaman birbirine eşittir, bazı istanai patolojik durumlar dışında.
Farklı bir probleme bakalım. Bu problemde bir eşitlik te olacak.
min px + qy öyle ki
a,b,c
x>0
y61
3x + y = 2
İkizi bulmak için her koşul için bir değişken atayalım, ama ondan önce her ana
koşulda eşitsizlikler aynı şekilde ise işimiz daha rahatlaşır (çünkü a, b, c, .. değişkenlerini
sıfırdan büyük yapacağız, ama farklı yönleri gösteren ana koşullar ile bu zorlaşıyor),
y 6 1 yerine −y > −1 mesela, o zaman
min px + qy öyle ki
a,b,c
x>0
−y > −1
3x + y = 2
ax > 0
−by > −b
3cx + cy = 2c
a, b > 0
c üzerinde koşul var mı? Hayır, çünkü c’nin çarptığı koşul bir eşitlik, c ne olursa
olsun yeni koşul geçerli, işaret değişiminden korkmaya gerek yok.
Önceden olduğu gibi bir toplam alıyoruz,
px + qy > −b + 2c
3
p = a + 3c, q = −b + c
İkiz problemi elde ettik, amaç ana problemin alt sınırı −b + 2c’yi maksimize et-
mek, üstteki iki şart ve a, b > 0 olacak şekilde.
max 2c − b öyle ki
a,b,c
a + 3c = p
−b + c = q
a, b > 0
Dersin geri kalanında ikizlikten genel bir çerçevede bahsedeceğim, sonra bir ilginç
örnek göreceğiz, ardından ikizliğe yeni bir bakış açısından yaklaşacağız, bu açı
çok önemli olacak. Dersi ikinci bir örnekle bitireceğiz.
LP’lere tüm genelliği ile bakalım şimdi. Önceki format neler olup bittiğini görmek
açısından faydalı, ama genel şablonu da görmek lazım.
Tanımlar
c ∈ Rn , A ∈ Rm×n , b ∈ Rm , G ∈ Rr×n , h ∈ Rr verili.
Ana Problem
min cT x öyle ki
x
Ax = b
Gx 6 h (1)
İkiz Problem
−AT u − GT v = c
v>0 (2)
aT (Ax − b) + vT (Gx − h) 6 0
4
olur çünkü olurluluk noktasında Ax − b = 0 ve Gx − h 6 0, bu sebeple üstteki
toplam tabii ki sıfırdan küçük.
Gruplarsak,
cT x > −bT u − hT v
Böylece eşitliğin sağ tarafı alt sınırım olur, sol tarafı ise ikiz değişkenlerim üzerinde
kısıtlama haline gelir, v > 0. Böylece ikiz probleme erişmiş oluyoruz.
Sonraki örneğe gelelim. Bu probleme maks akış min kesiş (max flow min cut)
problemi deniyor. Konunun gelişmesindeki ilginç bir hikaye 20. yüzyıl başında
Sovyetler maks akış Amerikalılar ise min kesiş problemlerini çözmeye odaklanmıştı,
fakat bu iki problem ikizlik üzerinden aslında aynı problem.
Maksimum akış problemi şöyle: bir yönlü çizit verildi diyelim,
İki nokta arasında bağlantı varsa cij o iki nokta i, j arasındaki bağlantının kapa-
sitesini gösteriyor, eğer bir tren hattından bahsediyorsak o bağlantıdan geçebilecek
yük miktarı, eğer su borusu ise oradan akabilecek su miktarı, ya da bir yol ise
o yolun uzunluğu, vs. olabilir. Bir bağlantıdan gerçekte olan akışı fij olarak
tanımlayabiliriz,
0 6 fij 6 cij
5
bariz) bir düğüme giren akışın çıkan akışla eşit olması.
X X
fik = fkj k ∈ V\{s, t}
(i,k)∈E kj
X
max fsj , öyle ki
f∈R|E|
(s,j)∈E
Fakat tek bir toplam ile tüm çizit üzerinden maksimum akışı nasıl formülize
edebildik? Hedef fonksiyonundaki toplam sadece başlangıç s’den çıkan akışa
bakıyor? Buradaki ufak numara yaptığımız kısıtlamayla bağlantılı, akışın muhafaza
edilmesini şart koştuğumuz için optimal akış, her ne ise, çıkış noktasından olan
toplamı ile varış noktasına girişi aynı tutmalı (aradaki geçiş düğümleri için de
aynı şey geçerli olduğu için tabii), bu sebeple optimizasyonu tek bir toplam ile
tanımlayabildik. Üstteki grafik örnekte görülüyor, çıkış toplam 3+2+1 varış toplam
4+2. O zaman çıkışı optimize edersek t’ye varan, tüm düğümler üzerinden ola-
bilecek akışı maksimize etmiş oluruz.
Bu programın ikizini hesaplayabiliriz, üstteki bir LP ikizini bulmayı biliyoruz,
ana LP’dekiler kısıtlamalar kadar yeni değişken elde ederiz, vs.. Daha önce min-
imizasyon problemlerinin ikizine baktık, ana problemde bir alt sınır elde etm-
6
eye uğraşıyorduk. Şimdi ana problem maksimizasyon, o zaman hedef için üst
sınır aramak bizi ikize götürür. Min probleminde bile hedefe bir eksi işareti ek-
lesem onu maksimizasyon olarak görebilirdim, ve üst sınıra bakabilirdim. İkizin
türetilmesi için notlara bakılabilir [2]. Sonuçta şu minimizasyonu elde ediyorum,
X
min bij cij öyle ki
b∈R|E| ,x∈R|V|
(i,j)∈E
bij > xi − xj
bij , xi , xj ∈ {0, 1} ∀i, j
Elde ettiğimiz sonuc (hala ikize gelmedik) şunu söylüyor, elimdeki düğümleri
öyle iki gruba ayırmak istiyorum ki (altta bir grup görülüyor, renkli kısım), bir
gruptan diğer gruba geçen kapasitelerin, geçen kenarların kapasitelerinin toplamı
minimal olsun.
Bu arada üstteki program bir LP değil, bir tamsayı programı (integer program)
çünkü eldeki düğümleri bir gruba ya da diğerine (0,1 değerleri üzerinden) atıyoruz,
değişkenler ikisel, doğal olarak tam sayılar. Şimdi ikize geliyoruz, ana problemi
ikiz üstteki tamsayı programının gevşetilmiş (relaxation) hali. 0,1 tamsayılarını
alıp onları 0 ile 1 arasında gidip gelebilen reel değişkenler olarak tanımlarsak bir
LP elde ederiz.
Yani ana / ikizlik ve üstteki gevşetme arasındaki ilişkiler şöyle
maksimum akış değeri 6 gevşetilmiş minimum kesiş 6 minimum kesişin kapa-
sitesi
Gevşetme ile minimum değer daha azaldı, tamsayı programını gevşetip dışbükey
program haline getirince bunun olduğu biliniyor, kısıtlama kümesini genişlettim,
bu minimumu küçültecektir.
Herhalde kesiş kelimesinin nereden geldiği anlaşılıyor şimdi, eğer elimde bir
makasla renkli bölgeye giden bağlantıları kessem, en az miktarda akışı kesmiş
7
olurum, ve o renkli bölge içindeki akış en yüksek kapasitede olur. Ve buradaki
problemde güçlü ikizlik durumu olduğu için bu iki değer birbirine eşit!
Şimdi LP ikizliğine farklı bir açıdan bakalım, ki bu açı oldukca faydalı olacak.
(1) ve (2) formunu tekrar hatırlayalım. Ana problemdeki cT x’e eşitlik ve eşitsizlik
kısıtlamalarını daha önce bir kez gördüğümüz gibi ekleyince,
f∗ = min cT x > min cT x+uT (Ax−b)+vT (Gx−h) > min cT x+uT (Ax−b)+vT (Gx−h)
x∈C x∈C x
En sağdaki eşitsizlik yeni eklendi, buradaki ifadenin ortadakinen tek farkı x’lerinin
sadece olurlu kümeden değil mümkün tüm x’ler olabilmesi. Herhangi bir x de
bizi herhangi bir hedefe götürebilecegi icin (kısıtlama kalmadı) −∞ bile olmak
mümkün, üstteki eşitsizlik bu sebeple doğru.
En sağdaki ifadeyi g(u, v) olarak yazabiliriz, u, v’nin bir fonksiyonu olarak. Bu
fonksiyon f∗ ’ye bir alt sınır sağlar,
f∗ > g(u, v)
v>0
Bu ikizi türetmenin bir başka yoludur. Üstteki problemden gelen g ki ona çoğunlukla
g∗ denir, f∗ için bir alt sınır oluşturacaktır,
g∗ 6 f∗
Şimdi g’nin nasıl bir fonksiyon olduğuna yakında bakalım. Tanım şöyleydi,
8
g(u, v) = min cT x + uT (Ax − b) + vT (Gx − h)
x
= min(cT + AT u + GT v)T x − bT u − hT u
x
Üstteki x bağlamında bir lineer fonksiyon değil mi? Birşeyler devriği çarpı x artı
birşeyler. Tüm x’ler üzerinden bu fonksiyonun minimumu nedir? Eksi sonsu-
zluk, eğer parantez içindeki değer sıfır değilse.. Değil mi? Eğer x sıfırla çarpılıp
yokedilmiyorsa x’i istediğim tarafa çekip hedefi istediğim kadar negatife götürebilirim.
Ama cT + AT u + GT v sıfır ise o zaman minimum nedir? Sıfırdan geri kalanlar,
−bT u − hT u, o zaman
−∞ eğer cT + AT u + GT v 6= 0
=
−bT u − hT u eğer cT + AT u + GT v = 0
c = −AT u − GT v, v>0
programıyla eşdeğerdir.
İkiz programa erişmiş olduk, farklı bir yönden geldik, ama yine (2) ile aynı nok-
taya ulaştık.
Bu ikinci türetiş şeklinin daha faydalı olmasının sebebini anlatalım şimdi. İlk ikiz
alma stratejimiz neydi? Elimizde
var, her kısıtlamaları ikiz değişkenler u, v ile çarpıyoruz, birleşik bir denklem, bir
lineer kombinasyon elde ediyoruz,
uT (Ax − b) + vT (Gx − h) 6 0
9
Sonra üstteki ifadeyi bir şekilde f(x)’e eşitlemem lazım, ya da f(x)’i içeren bir
şeylere eşitlemem lazım, ki onu kullanarak ana değer için bir alt sınır elde edebi-
leyim. İlk stratejimiz buydu değil mi?
elde etmek.
Bu iyi güzel ama genel bağlamda bu yöntem her zaman işlemez. Eğer f(x) lineer
değilse, onu lineer kombinasyonlar kullanarak nasıl elde edebiliriz ki? Mümkün
değil. Yani üstteki yöntem f(x) lineer ise işler, diğer durumlarda işlemez.
İkinci stratejinin güzel tarafı burada. Her zaman işler, yeter ki f dışbükey olsun.
Aslında bir açıdan dışbükeylik olmasa da işliyor, buna sonra geleceğiz. İkinci
stratejiyi tekrar hatırlarsak, bir Lagrangian oluşturmuştuk, bu ifadede ana hedefe
ikiz değişkenlerle noktasal çarpım üzerinden eklenen kısıtlamalar vardı, ve min-
imizasyonu olurlu set yerine tüm x’ler üzerinden yapıyorduk, ve bu bize her
zaman ana hedef için bir alt sınır veriyordu.
[Matris oyunları örneği atlandı]
Ekler
Altta maksimum akışı LP olarak çözen sayısal bir örnek görüyoruz.
Örnek
Alttaki örnekte [3] bir maksimum akış çözümü görelim. Çizit ve her kenarın
kapasiteleri görülüyor
A_ub = np.eye(5)
b_ub = np.array([1.,2.,2.,3.,1.])
A_eq = np.array([[1, 0, -1, -1, 0],
[0, 1, 1, 0, -1]])
b_eq = np.array([ 0, 0 ]);
f = np.array( [ 1, 1, 0, 0, 0 ])
res = linprog(-f, A_ub=A_ub, b_ub=b_ub, \
10
A_eq=A_eq, b_eq=b_eq)
print (np.round(res.x))
[1. 1. 0. 1. 1.]
print (res.x.dot(f))
1.9999999998438802
Not: linprog minimize etmeye ayarlı olduğu için hedefi eksi ile çarptık, yani
maksimizasyon yaptırmış olduk.
Maksimum akış 2.0 olarak bulundu.
Optimize edilen −fT x dersek vektör x içindeki öğeler e1 , e2 , e3 , e4 , e5 , ve f içinde
1, 1, 0, 0, 0 var, yani aslında sadece e1 , e2 ’nin akış toplamına bakmış oluyoruz. Bu
normal, sebeplerinden önce bahsetmiştik. Bulunan sonuç x∗ = (1, 1, 0, 1, 1), ve
fT x∗ çarpımı ilk iki öğeyi toplatıyor, ve 1+1 = 2, maksimum akış.
Eşitlik kısıtlamaları Aeq ve beq içinde, Aeq x = beq için. Sadece iki kısıtlama var,
bu kısıtlamalardan ilki 1’e giren e1 ile ondan çıkan e3 , e4 ’un eşit olması gerektiğini
söylüyor, bu sebeple ilk kısıtlama 1, 0, −1, −1, 0, ve ona tekabül eden beq sıfır
değerinde, e1 akışı ile e3 , e4 toplanırsa sıfır olsun demiş oluyoruz. İkinci kısıtlama
2’ye giren iki akış e2 , e3 ile çıkan e5 ’i dengeliyor.
Eşitsizlik kısıtlamaları Aub x 6 bub . Burada kapasiteleri kodluyoruz, her kenarın
kapasitesi belli, e1 için 1, e2 için 2, vs. Ve optimal sonuç bulunuyor.
Not: bu problemi lineer program olarak kodlayabilmek çok şey kazandırdı. Diğer
yandan üstteki problemi bilgisayar bilim bağlamında çözen yaklaşımlar da vardır,
hatta çizitin özel yapısından faydalanarak bu yaklaşımların bazıları oldukca hızlı.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 10, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Notes, https://www.stat.cmu.
edu/˜ryantibs/convexopt/
[3] Zisserman, C25 Optimization, http://www.robots.ox.ac.uk/˜az/lectures/
opt/
11
Genel Çifteşlik / İkizlik (General Duality)
Bu derste [1] genel dışbükey problemlerinde ikizlik konusunu göreceğiz, ek olarak
dışbükey olmayan durumlara da bakacağız. İkizlik oldukça genel bir konu.
Önceki derste ikizliği elde etmenin ikinci yönteminde
−∞ eğer cT + AT u + GT v 6= 0
g(u, v) =
−b u − h u eğer cT + AT u + GT v = 0
T T
hi (x) 6 0, i = 1, .., m
lj (x) 6 0, j = 1, .., r
1
Eğer sadece dışbükeylige bakıyor olsaydık f, hi ’lerin dışbükey, li ’lerin ise doğrusal
olması gerekirdi. Lagrangian’i tanımlayalım, hala çok genel bir şekilde yaklaşıyoruz
tabii,
X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
i=1 i=1
Niye? Daha önce LP’lerle gördüğümüz fikirle aynı durum, olurlu noktalarda
X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
| {z } | {z }
i=1 60 i=1 =0
Olurlu noktalarda li ’ler sıfır, o zaman tüm li ’leri toplamı yokolur, ui ’lerin hepsi
sıfırdan büyük olmalı ve olurlu noktada hi ’ler sıfırdan küçük, pozitif çarpı negatif
eşittir negatif, toplam negatif, f(x)’den bir değer eksiltilmiş olacaktır, bu da muhakkak
f(x)’den küçük bir sonuca sebep olacaktır, iki üstteki bu şekilde ispatlanmış olur.
Üstteki fonksiyonu, parçalarını grafiksel olarak alttaki gibi görebiliriz,
2
Kesiksiz çizgi kriter / hedef fonksiyonu örnek bir f. Dikkat edersek görülen f
dışbükey değil, bunu genel dışbükey olmayan ortamlarda da tekniğin işlediğini
göstermek için yaptık.
Noktalı eğrilerin her biri farklı u’lar için L’nin değerleri, ayrıca olurlu kümeyi
[−0.46, 0.46] arasında olacak şekilde seçtik. Yani
hi (x) 6 0
LP örneğindeki yaklaşım, sadece olurlu küme C yerine tüm x’ler üzerinden min-
imizasiyon bir alt sınır oluşturur. g(u, v)’ye ikiz fonksiyon diyoruz.
Peki niye g(u, v) tanımını minx∈C L(x, u, v) için yapmadım, tüm x’ler üzerinden
olan kısıtlanmamış versiyon için yaptım? Çünkü tüm x’ler üzerinden olan tanım
bizim için daha faydalı. O tür ifadeler üzerinde analitik çözüm geliştirmek daha
rahattır, analitik çözüm olmasa bile tüm x’ler üzerinden yaklaşım daha faydalı.
Tabii hala bazı kısıtlamalar var, mesela u > 0 olmalı.
İkiz fonksiyon g’nin λ’ya (aslında u) gore bir grafiğini altta görüyoruz,
3
Peki niye ikizi yapabildiğim en büyük değer kriterin olurlu kümede olabilecek
en ufak değerine eşit değil (ikizin tepesi kesikli çizgiye değmiyor)? Çünkü elim-
izdeki bir dışbükey olmayan fonksiyon. Dişbükeylik olsaydı alt sınır sıkı olurdu.
Dışbükey olmayan fonksiyonlarda da sıkılık görülebilir ama dışbükeylik duru-
mundaki gibi bu şart değildir.
Biraz daha zor bir örneğe bakalım.
Standart formda bir karesel program (QP).
1
min xT Qx + cT x öyle ki
x 2
Ax = b, x > 0
1
L(x, u, v) = xT Qx + cT x − uT x + vT (Ax − b) (2)
2
1
= min xT Qx + (c − u + AT v)T x − bT v (1)
x 2
Bu minimumu nasıl buluruz? Gradyanı alıp sıfıra eşitleriz değil mi? Tabii üstteki
tanıdık bir formda, eğer tek boyuttan hatırlarsak,
ax2 + bx + c
1 T
x Qx + bT x
2
için çözüm x∗ = −Q−1 b. Bunu biliyorum çünkü pek çok kez bu çözümü türettim,
hatırlıyorum. Bu formu bizim probleme uygularsak, (1) içindeki parantezde görülen
c − u + AT v kısmı üstteki b oluyor. O zaman Lagrangian’ın minimize edicisi
4
x∗ = −Q−1 (c − u + AT v)
1
= (c − u + AT v)T Q−1 (c − u + AT v) − (c − u + AT v)T Q−1 (c − u + AT v) − bT v
2
Geriye tek Q−1 kaldı çünkü (2)’ye x∗ ’i soktuğumuz zaman Q ile çarpılan ilk
Q−1 iptal oldu, ikincisi geriye kaldı, basitleştirince Lagrange ikiz fonksiyonu elde
ediyoruz,
1
g(u, v) = − (c − u + AT v)T Q−1 (c − u + AT v) − bT v (3)
2
Yani bana verilen her u > 0 ve herhangi v için hesaplayacağım üstteki formül,
bana karesel programın optimumu için bir alt sınır veriyor.
Hiç te önemsiz olmayan bir sonuç, ama bu noktaya son derece önemsiz (gibi
gözüken), gayet basit ifadeleri bir araya koyarak geldik. Ama karesel program
için elde ettiğimiz sonuca bakın. Başta gördüğümüz genel form bir QP. (3)’un
bu QP’nin optimal değeri için bir alt sınır oluşturacağı ilk bakışta bariz gibi dur-
muyor. Ama bu böyle, ve Lagrangian ikiz fonksiyonun bir özelliğinin sonucu bizi
buraya getiriyor, birkaç satırlık ifadeyle üstteki kuvvetli sonucu doğrulayabiliyoruz.
Farklı bir varyasyona bakalım şimdi, ya Q 0 olsaydı, yani Q pozitif yarı kesin
olsaydı?
Bu durumda yine Lagrangian’in gradyanını alıp sıfıra eşitlerdik, vs. ve
Qx = −(c − u + AT v) (4)
elde ederdik, fakat Q’nun tersini alıp x’i elde edemezdik çünkü Q pozitif kesin
değil.
Çözüm için iki şartı gözönüne almak lazım,
1) c − u + AT v ∈ col(Q) ki col(Q) Q’nun kolon uzayı demek, yani (4) lineer
ifadesini tatmin eden bir x var. Bu durumda x∗
x∗ = −Q+ (c − u + AT v)
5
değer ayrıştırması (singular value decomposition) üzerinden tanımlanıyor. Ama
Q simetrik olduğu için onun öz ayrıştırmasını (eigen decomposition) yazsam da
olur herhalde, Q’yu şu sekilde yazsaydım,
Q = UDUT
Eğer Q pozitif yarı kesin ise o zaman D içinde bazı değerlerin sıfır olması mümkün,
yani şunun gibi bir durum olabilir,
d1
..
.
T
= U U
dr
0
0
Q+ sözde tersini tanımlamanın bir yolu üstteki öz ayrıştırma üzerindendir (dikdörtgensel
matrisler için SVD üzerinden).
Ama ondan önce bir soru, eğer tüm değerleri sıfır olmayan bir D üzerinden bir öz
ayrıştırmam olsaydı? Basit, UD−1 UT değil mi? Unutmayalım U matrisi dikgen.
Ama pozitif yarı kesinlik var, o yüzden D’nin tersini alamıyorum. Bu sebeple
sözde ters işlemi D içindeki tersi alınabilen değerlerin tersini alıp diğerlerini
olduğu gibi bırakmak üzerinden tanımlanmıştır.
1/d1
..
.
+ T
Q = U U
1/dr
0
0
c − u + AT v ⊥ null(Q)
6
Çünkü düşünürsek sıfır uzayında olan x seçeneği (1)’in ilk terimini sıfır yapar,
ama ikinci terimi istediğimiz yöne çekebiliriz, ta ki −∞ olana kadar.
− 12 (c − u + AT v)T Q−1 (c − u + AT v) − bT v eğer c − u + AT v ⊥ null(Q)
g(u, v) =
−∞ eğer tersi doğruysa
Şimdi geri bir adım atıp her şeye bakalım. Elimizde bir QP varsa Lagrange ikiz
fonksiyon da karesel, o zaman Lagrange ikizi maksimize etmek hala bir QP. Yani
QP’lerin ikizleri yine QP.
Biraz önce gördüğümüz QP örneğinde Lagrange ikiz karesel, ama tanım kümesinde
(domain) bir kısıtlama var, üstteki g(u, v)’de görüyoruz. Fakat bu tanım kümesi
kısıtlamasını bir QP kısıtlamasına çevirebiliriz, spesifik olarak u, v üzerinde bir
eşitlik kısıtlamasına. null(Q)’ya dikgen olmak demek Q’nun sıfır uzayına olan
yansıtma matrisini, P diyelim, alıp c − u + AT v ile çarparsam sıfır sonucunu al-
malıyım. Bunu eşitlik kısıtlaması olarak kodlayabilirim. Tabii bu tür bir eşitlik
kısıtlaması eklemek ikiz problemi daha çetrefil hale getirecektir.
Bir diğer örneğe bakalım. Bu çok daha basit bir karesel program, iki boyutlu.
1
min f(x) = xT QxbT x öyle ki
x∈(x1 ,x2 ) 2
x>0
İkiz fonksiyon
1
g(u) = min xT Qx + bT x − uT x
x 2
ki u = (u1 , u2 )
Ana problem karesel, ikiz de karesel. Problemleri grafik olarak görelim, hem ana
(primal) hem de ikiz (dual) aynı grafikte olacak şekilde,
7
İkizin nasıl gözükeceğini daha önceki örneklerden tahmin edebilirdik, (3) formülünde
eksi işareti var, ikiz bir içbükey yüzey olacak.
İlginç bir şey görüyoruz, ana problemin en küçük olduğu nokta ikizin en büyük
olduğu noktada. Üstteki sistem sıkı olacak gibi duruyor, eğer üstteki g(u)’yu
maksimize etmek bana f∗ ’i geri verecek. Bu durumun bu örneğe özel olmadığını
belirtmek isterim, dışbükey problemlerde sık sık olan bir şey bu.
Bir diğer ilginç durum, ikiz çözümün nerede olduğu, yani u1 , u2 ’den bahsediyo-
rum, kriterden değil. Kriter çözüm noktasında ana ve ikizde uymalı. İkiz çözüm
(0, 0)’da. Ana çözüm, resimden pek belli olmuyor ama x1 , x2 kordinat sisteminin
içlerine doğru bir yerlerde yani her ikisi de harfiyen pozitif. Bu bir raslantı mı?
Yani x1 , x2 harfiyen pozitif ise (yani > 0) ikizin sıfır olma durumu?
Değil. Burada olan birbirini tamamlayan serbestlik (complementary slackness)
durumu. Bu kavramı Karush-Kuhn-Tucker (KKT) şartlarını işlediğimizde öğreneceğiz.
Eğer problemde gördüğümüz sınırlamaların herhangi biri çözüm noktasında sıkı
değilse ona tekabül eden ikiz değişken sıfır olmalı. Bu olması gereken bir fenomen
ve ispatını da yapacağız. Üstteki örnekte her iki şart da çözümde sıkı değil, x her
iki kordinatta da sıfırdan büyük, bu her iki ikiz değişkeni çözümde sıfır olmaya
zorluyor.
Tekrar üzerinden geçersek, bir ana problem,
hi (x) 6 0, i = 1, .., m
lj (x) = 0, j = 1, .., r
8
için bir ikiz g(u, v) oluşturabiliriz ki her zaman f∗ > g(u, v) olacaktır her u > 0 ve
v için. O zaman en iyi alt sınır g(u, v)’yi tüm olurlu u, v’ler üzerinden maksimize
ederek elde edilir. Bu bize Lagrange ikizi problemi verir,
u>0
Önemli bir özellik zayıf ikizlik durumu, eğer ikizin optimal değerine g∗ dersek
f∗ > g ∗ .
Üstteki ilişki ana problem dışbükey olmasa bile işliyor. Yani elimizde müthiş
dışbükey olmayan çok zor bir optimizasyon problemi olabilir, ama onun ikizini
oluşturursak bu yeni problemin optimal değeri her zaman ana problem için bir
alt sınır oluşturuyor. Bazen bu optimal değerin kendisi bile faydalı, belki kriter
fonksiyonun kendisi mesela bir ekonomik bedel, bir yol miktarı, vs gibi bir şeyi
temsil ediyor ve ona iyi bir alt sınır bulmak bile bize önemli bir bilgi veriyor.
Şimdi sıkı durun, dahası da var. Birazdan bahsedeceğim şey ilk duyanları çok
şaşırtıyor. İkiz problem her zaman bir içbükey / dışbükey optimizasyon prob-
lemi. Bu önemli çünkü dışbükey programları bir şekilde muhakkak sayısal olarak
çözebiliyoruz, cvx paketi ile belki, ya da altgradyan (subgradient) metotlarıyla..
bir şekilde bu olur. Bilimin vardığı nokta burası, o problem çözüldü. Bu çok
iyi çünkü eğer ana problem minimizasyon problemi ise ikiz her zaman içbükey
maksimizasyon, ya da diğer yönde ana problem maksimizasyon ise ikiz dışbükey
minimizasyon, ve içbükey / dışbükey problemi çözebiliyoruz. Bu her zaman
doğru, ana problem ne olursa olsun.
Niye? İspatını yapacağız, ana maksimizasyondan başlayarak g’nin her zaman bir
içbükey fonksiyon olduğunu ispatlayacağız. Bu ispat çok basit aslında. Tanım
itibariyle,
X
m X
r
g(u, v) = min f(x) + ui hi (x) + vi li (x)
x
i=1 i=1
9
Fakat genel uygulamalarda önümüze bazı engeller çıkabiliyor. Mesela Lagrangian’ın
kendisinin hesabı oldukca çetrefil olabilir. Eğer ana problem dışbükey ise La-
grangian hesabı kolay ama çetrefil f(x)’ler için bu iş daha zor. Yani dışbükey
olmayan ana problemin şanslıysak ikiz hesabı kolaydır, ama çoğunlukla iş zor.
Altta bir örnek seçtim, öyle ki ikiz hesaplanabilir halde olacak, her ne kadar ana
problem olmasa da.
Sol grafikteki koyu siyah nokta ikizdeki maksimuma tekabül eden nokta, gerçek
minimum değil, o minimum biraz daha sola doğru. Sağdaki ikiz grafiğini hesapladım,
u yok tabii çünkü eşitlik kısıtlaması yok. İkizin içbükey olduğuna dikkat. Ana
problem dışbükey değil, ama ikiz içbükey.
Ayrıca ikiz aşağı yukarı “parçalı lineer” denebilecek bir halde, ki bu durum da
ana problem dışbükey olmadığında yaygın şekilde görülen bir durum.
Bu arada eğer g’yi cebirsel olarak türetirsek, oldukca çetrefil bir form elde edeceğimizi
görebiliriz [türetim atlandı, burada benim notum, içbükey bir problemi pür sayısal
olarak çözmenin nasıl olsa mümkün olacağı].
Güçlü İkizlik
Daha önce f∗ > g∗ olması gerektiğini gördük. Fakat pek çok problemde
f∗ = g∗
olduğunu da gördük. Yani ana ve ikiz problem arasında hiç boşluk yok. Buna
güçlü ikizlik ismi veriliyor. Hatta bu durum neredeyse her dışbükey optimiza-
syon probleminde ortaya çıkıyor. Neredeyse dedik çünkü Slater şartı denen bir
şart da lazım bu şarta göre eğer olurlu kümede tüm eşitlik tüm eşitsizlik şartlarını
10
harfiyen yerine getiren en az bir nokta varsa o zaman güçlü ikizlik var. Harfiyen
derken tüm eşitlik şartları sıfıra eşit, tüm eşitsizlikler sıfırdan küçük olmalı.
Çoğunlukla bu çok, çok zayıf bir şart, yani yerine getirmesi çok kolay. Yani ana
problemin dışbükey olup da Slater şartına uymaması çok nadirdir, eğer ana prob-
lemde çok absürt şartların olması lazım.
Slater şartının LP’ler için anlamı nedir? LP’ler zaten doğal olarak dışbükeydir,
ama onlar için zaten tüm şartlar doğrusal olduğu için LP olurlu ise otomatik
olarak güçlü ikizlik vardır [gerisi atlandı]
İkizlik Boşluğu (Duality Gap)
Bir basit kavrama daha değinelim. Basit ama çok faydalı olabilir, mesela ana
ve ikizi optimize etmek içi bir özyineli algoritma geliştiriyorsunuz, ve bir olurlu
x’imiz ve olurlu u, v’miz var ise,
f(x) − g(u, v)
11
Karush-Kuhn-Tucker (KKT) Şartları
KKT şartları birkaç basit kavramın bir araya gelmesiyle oluşan çok kuvvetli bir
kavram. Bu şartlar 4 tane. Alttaki gibi genel bir problemle bağlantılılar,
hi (x) 6 0, i = 1, .., m
lj (x) = 0, j = 1, .., r
Lagrangian’ı hatırlarsak,
X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
| {z } | {z }
i=1 60 i=1 =0
X X
m r
!
0 ∈ ∂x f(x) + ui hi (x) + vj lj (x)
i=1 j=1
ui · hi (x) = 0 ∀i
Üstteki şart diyor ki ya hi (x) sıfır olmalı, yani i’inci eşitsizlik sıkı olmalı, ya da
ona tekabül eden ikiz değişken ui sıfır olmalı, yani eşitsizlik ya sıkı -eşitlik- ya da
dikkate alınmamalı.
3) Ana Olurluk
4) İkiz Olurluğu
ui > 0, ∀i
1
İspatlayalım. Önce ters yönden gelerek bir ispat, diyelim ki elimde ana ve ikiz
çözümler var. Eğer o “çözüm varsa, oradan KKT şartları meydana çıkmalı” is-
patını görelim. Bu yöne “gereklilik” (necessary) denebilir. Diyelim ki x∗ , ve u∗ , v∗
ana ve ikiz çözümleri var, ve ikizlik boşluğu sıfır (yani güçlü ikizlik aktif, Slater
şartını hatırlarsak). O zaman
f(x∗ ) = g(u∗ , v∗ )
X
m X
r
= min f(x) + u∗i hi (x) + v∗j lj (x)
x
i=1 j=1
X
m X
r
∗ ∗ ∗
6 f(x ) + ui hi (x ) + vj ∗ lj (x∗ ) (1)
i=1 j=1
Devam edersek, u∗i olurlu, o zaman üstteki ortadaki terim > 0, v∗i olurlu o zaman
üçüncü terim sıfır. Bu demektir ki üstteki ifade f(x∗ )’den daha az olmalı.
6 f(x∗ ) (2)
Sonuç olarak
f(x∗ ) 6 f(x∗ ∗)
elde ettik, o zaman üstteki ifade aslında eşitsizlik değil bir eşitlik çünkü eşitsizliğin
iki tarafında aynı şey var.
Eşitsizliklerin eşitlik olması ne anlama gelir? Demek ki x∗ Lagrangian’ı u∗ , v∗
noktasında minimize edecektir. Durağanlık bu demek zaten değil mi? x’e göre
Lagrangian’ın altgradyanını aldım ve bu sıfıra eşit. Ayrıca tamamlayan gevşeklik
şartı da ispatlanmış oluyor, (1) ile (2) eşit olmalıysa, ve (1)’deki 3. terimin sıfır
olduğunu biliyoruz, 2. terimdeki tamamı pozitif olan toplam öğeleride sıfır ol-
malı çünkü başka türlü (2)’ye eşitliği elde edemeyiz. Eh bu durum da tamam-
layan gevşeklik şartı değil midir?
Ana-ikiz olurluğunu zaten bedava elde ettik. Elimizde bir çözüm varsa onlar
ana-ikiz olurlu olmalı.
2
Yani ispatlamış olduk ki eğer elimizde ana-ikiz boşluğu olmayan bir çözüm varsa,
x∗ , u∗ , v∗ çözüm üçlüsü KKT koşullarına uymaktadır. KKT koşularının güçlü iki-
zlik durumunda şart olduğunu göstermiş olduk.
Diğer yönden ispat etmeye uğraşalım.
Elimizde KKT şartlarını tatmin eden bir x∗ , u∗ , v∗ üçlüsü olduğunu düşünelim, ve
bu üçlünün optimal olması gerektiğini ispat edelim, yani x∗ ’in ana u∗ , v∗ ’nin ikiz
problem için optimal olması gerektiğini.. Eğer x∗ , u∗ , v∗ KKT şartlarına uygunsa,
durağanlığa göre
X
m X
r
∗ ∗ ∗ ∗ ∗
g(u , v ) = f(x ) + ui hi (x ) + vj ∗ lj (x∗ ) (3)
i=1 j=1
ve durağanlıkla
= min L(x∗ , u∗ , v∗ )
x
X
m
X r
∗ ∗ ∗ ∗
∗ ∗ ∗
g(u , v ) = f(x )+ u
ih
i (x ) + v
j lj (x )
i=1
j=1
= f(x∗ )
Eğer g(u∗ , v∗ ) = f(x∗ ) ise o zaman ana ve ikiz kriter arasında ikizlik boşluğu
yoktur demektir, ve daha önce gördüğümüz gibi bu elimizdekinin bir çözüm
olduğunun işaretidir.
Yani birkaç farklı yönden gelerek ispatladık ki x∗ ve u∗ , v∗ KKT koşullarına uyuy-
orsa, o zaman elimizdekiler optimal ana ve ikiz çözümleridir. KKT koşulları her
zaman yeterlidir. Dikkat edilirse dışbükeylikten hiç bahsetmedik, KKT yeterli
(sufficient), onlara uygunluk varsa optimal ana ve ikiz çözüme erişmişiz demek-
tir. Gereklilik (necessary) durumu eğer güçlü dışbükeylik varsa, elimizdeki çözüm
3
KKT koşullarına da uymaya mecbur. Biraz söz cambazlığı gibi gelebilir ama
tanımların net olması, ve ilerideki teorilere faydası açısından bu iyi.
Soru
Eğer KKT koşullarını tatmin etmek optimallik için yeterliyse dünyadaki her prob-
lemi KKT üzerinde rahatça çözebilir miyim?
Hayır çünkü 1. KKT şartı, durağanlık şartıyla problem çıkabilir. Pürüzsüz bir
problem için durağanlık için f ve hi , li ’in gradyanlarını almam yeter, sıfıra eşitlerim
vs. Bir de dışbükeylik varsa tipik olarak altgradyanı yazmak basittir. Sonucu bul-
mak her zaman kolay olmayabilir ama en azından durağanlığı formülize etmek
kolaydır. Fakat bazı fonksiyonlarda dışbükeylik yoksa altgradyanları hesapla-
manın zorluğu ötesinde bazen altgradyan olmayabilir bile. Genelde pürüzsüz
durumlarda KKT koşullarını kullanmanın zor tarafı budur.
Bu sebeple formel bir uyarıyı slaytlara koyduk, “eğer f dışbükey değilse türevi
alınabilir bir f için bile direk ∂f = {∇f(x)} diyemeyiz”.
Eğer ana problemde hiçbir kısıtlama olmasaydı o zaman 2. 3. ve 4. KKT şartları
yokoluyor bu normal çünkü ikiz değişken olmayacak, 1. şarttaki 2. ve 3. terim
yokolur, sadece altgradyanın sıfırı içerme şartı geriye kalıyor. Bazen bilimci-
lerin bu tür problemlerde salt altgradyan optimalliği kullanıp “KKT koşulları
kullandım” dediğini duyabilirsiniz, ben bile dalgınlıkla bunu söyleyebiliyorum
bazen. Fonksiyon var, altgradyanını alıp sıfıra eşitliyorum, bu “KKT koşulu” diy-
orum. Teknik olarak doğru tabii, sadece KKT’nin çok basit bir hali bu.
Örnek
Eşitlik şartları olan karesel bir fonksiyonun minimizasyonuna bakalım.
1
min xT Qx + cT x öyle ki
x 2
Ax = 0
1
L(x, u) = xT Qx + cT x + uT Ax
2
Qx + c + AT u = 0
Tamamlayıcı gevşeklik
4
(Boş, çünkü eşitsizlik şartları yok)
Ana-ikiz olurluk
İkiz olurluk boş, çünkü eşitsizlik yok, yani u’nin pozitif olma şartı yok. Ana
olurluk ise
Ax = 0
Biliyoruz ki üstteki iki şartı tatmin edersem x ana, u ikiz optimal çözüm olacak.
Güzel değil mi? Hatta bu lineer bir sistem olarak yazılabilir,
Q AT x −c
=
A 0 u 0
x1 + x2 = 5
Burada bir eşitlikle kısıtlanmış QP (equality constrained QP) var ve biraz önce
gördüğümüz KKT matrisini oluşturarak onu tek adımda çözebiliriz. Kriter ve
kısıtlama matris formunda şöyle, x = (x1 , x2 ) alırsak,
1 2 0 T
f(x) = xT
x+ 0 0 x
2 0 2
| {z }
Q
x2
1 1 =5
| {z } x2
A
(Sıfır vektörü var çünkü x21 , x22 içeren terimler var ama x1 , x2 içeren terimler yok)
5
KKT matrisini şöyle oluştururuz,
Q AT x −c
=
A 0 u b
2 0 1 x1 0
0 2 1 · x2 = 0
1 1 0 u 5
Ekler
Soru
Eğer KKT şartını eşitlik sınırlanmış QP (bilahere LP) çözmek için kullanabiliy-
orsam, ve mesela LP diyelim, her eşitsizlik içeren problemi standardizasyon ile
eşitlikle sınırlı probleme çevirebiliyorsam, KKT matrisi ile her türlü LP’yi çözemez
miyim? Niye farklı metotlara giriş yapmak gerekiyor?
Cevap
Standardizasyon sonrası hala elimizde pozitiflik sınırlamaları var, ki bunlar da
birer eşitsizlik sınırı aslında. KKT matrisi çözmek bu eşitsizlikleri tatmin etmez,
6
basit bir matris tersi alıyoruz, elimize geçen değişkenlerin pozitif kalma zorun-
luluğunu bu metot ile zorlayamayız.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 12, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Lendek, Optimization Lecture, Quadratic Programming http://www.lendek.
net/teaching/opt_en/
7
Destek Vektor Makinaları (Support Vector Machines)
En basit halleriyle SVM’ler risk minimize eden lineer sınıflayıcısıdırlar.
s
h × (log( 2N
h
) + 1) − log( η4 )
R(Θ) 6 J(Θ) = Remp (Θ) +
N
h: sınıflayıcının kapasitesi
N: eğitim verisinde kaç veri noktası olduğu
Vapnik ve Chernovenkis 1 − η olasılıkla ispaladı ki üstteki denklem doğrudur.
SVM algoritması hem h değerini hem de sayısal, ölçümsel riski aynı anda min-
imize etmektedir, ve bunu sınır noktalarını noktalarını ayırmakla yapmaktadır.
Türetelim,
Karar düzlemi: wT x + b = 0
Şöyle bir tanım yapalım:
q = min
x − 0
, wT x + b = 0 sartina gore
x
1
2
min
x − 0
+ λ(wT x + b)
x 2
∂ 1 T
( x x + λ(wT x + b)) = 0
∂x 2
1
x + λw = 0
x = −λw
wT (−λw) + b = 0
b
λ=
wT w
Yani çözüm
b
x̂ = − w
wT w
O zaman q
b
q = ||x̂ − 0|| = − T w
w w
b √
× wT w
wT w
|b|
q=
||w||
Tanım:
H+ = wT x + b = +1
H− = wT x + b = −1
grafikte görüldüğü gibi yani. Üstteki şekilde tanımın bir zararı yok (çünkü +1,-1
sabit durunca ayraç genişlemesi nasıl olacak diye düşünülebilir, ama bu tanım
genelliği kaybetmeden yapabilabiliyor çünkü b, w değerlerinde hala oynanabilir.
q+ ve q− değerlerini hesapla
|b − 1|
q+ =
||w||
2
| − b − 1|
q− =
||w||
|b − 1 − b − 1| | − 2| 2
m = q+ + q− = = =
||w|| ||w|| ||w||
2
Ayraçların olabildiğince ayırmasını istiyorsak m’i arttırız (yani ||w||
’i maksimize
ederiz), ya da ||w|| değerini minimize ederiz.
Sınırlar
Veri noktalarını öyle sınıflamak istiyoruz ki + ve - noktalar hiperdüzlemlerin
doğru noktalarında kalsınlar.
wT x + b 6 −1, ∀yi = −1
yi (wT x + b) − 1 > 0
1
min ||w||2 , yi (wT xi + b) − 1 > 0 olsun.
w 2
Bu form tanıdık geliyor mu? Bu qp ile çözülebilecek karesel (quadratic) bir formül,
programdır!
qp
Python dilinde cvxopt paketi vardır Matlab Optimization Toolbox’da qp() var.
QP fonksiyonları problemleri genelde
1 T
x Px + qT x
2
formunda görmek isterler. Biraz önce elde ettiğimiz denklemi bu istenen formata
doğru “masajlayabiliriz”
İkiz (dual)
3
SVM ihtiyaçları için ikiz formül (dual) ile çalışmak daha rahattır Lagrange (tekrar)
oluşturalım, türevi alalım, ve sıfıra eşitleyelim. Bunun sonucunda elimize KKT
noktaları geçecektir
1 X
Lp = ||w||2 − αi (yi (wT xi + b) − 1)
2 i
∂ X
Lp = w − αi yi xi = 0
∂w i
X
w= αi yi xi
i
∂ X
Lp = − αi yi = 0
∂b i
X 1 XX
Maksimize et LD = αi − αi αj yi yj xTi xj
i
2 i j
sınırlar
X
αi yi = 0
i
αi > 0
qp
Bu yine qp() formunda bir problem! Sadece bu sefer çözeceğimiz değişkenler
αi ’lar, x’lar değil. Üstteki denklem şu forma 12 xT Px + qT x masajlanabilir Bunun
yapmak için Pi,j ’ye −yi yj xTi xj değerini atarız. Ve qp’yi çağırırız Sonuç bir α’lar
listesi olacaktır.
b değerini hesaplamak
KKT koşulunun sebebiyle sıfır olmayan her αi için ana problemde ona tekabül
eden kısıtlayıcı şart şıkıdır (tight), yani bir eşitliktir. O zaman sıfır olmayan her αi
için b’yi wT xi + b = yi ifadesini kullanarak hesaplarız. Sıfır olmayan her αi ’dan
gelen b yaklaşık olarak diğer other b’lere eşit olacaktır. Final b’yi hesaplamak için
tüm b’lerin ortalamasını almak sayısal (numeric) olarak daha garantidir.
Sınıflayıcı Tamamlandı
4
Her yeni x noktası için artık sign(xT w + b) ibaresini sınıflayıcımız olarak kullan-
abiliriz. −1 ya da +1 olarak geri gelecek sonuç bize yeni noktanın hangi sınıfa ait
olduğunu söyleyecektir.
Örnek Çıktı
Çekirdekler (Kernels)
Şimdiye kadar lineer ayraçlardan bahsettik. SVM’ler lineer olmayan ayraçlarla
da çalışabilir. Çok basit: Bir temel fonksiyon kullanarak girdiyi daha yüksek
boyuta doğru bir önişlemden geçirirsek bunu başarabiliriz. Algoritmanın geri
kalanı değişmeden kalacaktır.
Gayri Lineer Çekirdek
Esneme Payı Bazen bir problem ayrılmaya müsait olmayabilir. Çok üç nokta-
lardaki bazı noktalar sınıflayıcının çalışmasını imkansız hale getirebilir Bunun
çözümü için sınıflayıcıya ”esneme payı” dahil edebiliriz. Mesela yi = +1 için
verinin yanlış tarafa düşmesini şu durumda izin verebiliriz: wT + b > −0.03
Fakat eklemek gerekir ki bu tür noktaların “çok fazla” olmasını da istemiyoruz,
bu sebeple bu ”yanlış” noktaların sayısına da bir ceza getirebiliriz.
# Gram matrix
K = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):
5
K[i,j] = np.dot(X[i], X[j])
P = cvxopt.matrix(np.outer(y,y) * K)
q = cvxopt.matrix(np.ones(n_samples) * -1)
A = cvxopt.matrix(y, (1,n_samples))
b = cvxopt.matrix(0.0)
G = cvxopt.matrix(np.diag(np.ones(n_samples) * -1))
h = cvxopt.matrix(np.zeros(n_samples))
# solve QP problem
solution = cvxopt.solvers.qp(P, q, G, h, A, b)
print solution
# Lagrange multipliers
a = np.ravel(solution['x'])
print "a", a
# Intercept
b = 0
for n in range(len(a)):
b += sv_y[n]
b -= np.sum(a * sv_y * K[ind[n],ssv])
b /= len(a)
# Weight vector
w = np.zeros(n_features)
for n in range(len(a)):
w += a[n] * sv_y[n] * sv[n]
print "a", a
return w, b, sv_y, sv, a
X = np.array([[3.,3.],[4.,4.],[7.,7.],[8.,8.]])
y = np.array([1.,1.,-1.,-1.])
w, b, sv_y, sv, a = svm(X, y)
print "w", w
print "b", b
print 'test points'
print np.dot([2.,2.], w) + b # > 1
print np.dot([9.,9.], w) + b # < -1
6
1: -3.6857e-02 -3.0976e-01 3e-01 4e-16 1e-15
2: -1.0255e-01 -1.2816e-01 3e-02 3e-17 7e-16
3: -1.1074e-01 -1.1128e-01 5e-04 3e-17 7e-16
4: -1.1111e-01 -1.1111e-01 5e-06 4e-17 7e-16
5: -1.1111e-01 -1.1111e-01 5e-08 1e-17 6e-16
Optimal solution found.
{'status': 'optimal', 'dual slack': 7.403425105865883e-08, 'iterations': 5, 'relative
a [ 2.76375125e-08 1.11111073e-01 1.11111073e-01 2.76375125e-08]
2 support vectors out of 4 points
sv [[ 4. 4.]
[ 7. 7.]]
sv_y [ 1. -1.]
a [ 0.11111107 0.11111107]
w [-0.33333322 -0.33333322]
b 3.66666541806
test points
2.33333253877
-2.33333253877
Not: İkizdeki Ld ’yi maksimize ediyoruz, fakat hala qp()’deki minimize ediciyi
çağırıyoruz. Bu sebeple tüm α’ların toplamını temsil eden q’ların negatifini alıyoruz,
np.ones(n_samples) *-1 işleminde görüldüğü gibi. Formüldeki karesel kısım
içinde zaten − 21 negatif ibaresi var, böylece geri kalan formülün değişmesine
gerek yok.
Dayanaklı Kayıp Fonksiyonu ile SVM, Pegasos
SVM problemi alttaki fonksiyonu çözmek anlamına geliyordu,
1
min ||w||2 , s.t. yi (wT xi + b) − 1 > 0
w 2
1 X
min ||w||2 + max{0, 1 − yi (wT xi )}
w 2
olarak yazıyorlar. Ayrıca regülarizasyonu kontrol etmek için bir λ sabiti de ek-
leniyor, yani üstte λ||w||2 /2 kullanılması lazım. Regülarize işlemi w’nin norm’unun
küçük olmasını tercih eder, ki bu bazı w değerlerinin sıfıra gitmesini zorlar, yani
bir tür özellik seçme işi bu şekilde gerçekleşmiş olur. Toplam işleminin içindeki
fonksiyona “kayıp fonksiyonu (loss function)” ismi de verilir, eğer bu kayıp fonksiy-
onu tam üstteki gibi ise ona dayanaklı kayıp (hinge loss) denir. Üstte görülen max
ifadesi suna eşittir,
1 − yi · (w · xi ) eğer yi · (w · xi ) < 1
Loss(w, xi , yi ) =
0 diğer
7
∂Loss(w, xi , yi ) −yi xi eğer yi · (w · xi ) < 1
∇L = =
∂w 0 diğer
Böylece bir rasgele gradyan iniş (stochastic gradient descent) yaklaşımını kod-
layabiliriz.
1 X
wt+1 = wt − η λwt + ∇L
b x ,y ∈B
i i t
data_train = df.head(5413)
data_test = df.tail(1000)
label_train = labels.head(5413)
8
label_test = labels.tail(1000)
np.random.seed(0)
9
pred = clf.predict(data_train)
print 'egitim',show_auc(np.array(label_train.T)[0], pred)
pred = clf.predict(data_test)
print 'test',show_auc(np.array(label_test.T)[0], pred)
Kaynaklar
[1] Blondel, https://gist.github.com/mblondel/586753
[2] Jebara, T., Machine Learning Lecture, Columbia University
[3] Song, et al., Stochastic gradient descent with differentially private updates
[4] Harrington, Machine Learning in Action
[5] Stanford, Stanford, CS246: Mining Massive Data Sets, http://web.stanford.
edu/class/cs246/
10
Log-Bariyer Yöntemi
Bir dışbükey probleme bakalım şimdi, artık tanıdık olan genel form bu,
Tüm bu fonksiyonların dışbükey ve iki kere türevi alınabilir olduğunu farz ediy-
oruz. Şimdi log bariyer metotu uygulayacağız, bu ilk göreceğimiz iç-nokta yöntemi
olacak [1, 14:00].
Bu yöntem ile önce eşitsizlik kısıtlamalarına tekabül eden bir log bariyer fonksiy-
onu tanımlamak gerekiyor. Bu fonksiyon,
X
m
φ(x) = − log(−hi (x))
i=1
X
m
min f(x) + Ihi (x)60 (x)
x
i=1
I her hi ’nin sıfırdan küçük olup olmadığına göre 0 ya da çok büyük değerler verir,
bu yüzden üstteki gibi bir temsil, eşitsizlik kısıtlamalarını kullanmakla eşdeğerdir.
Çünkü minimizasyon problemi doğal olarak çok büyük değerlerden kaçacak, ve
böylece kısıtlamalar dolaylı yoldan problem çözümüne dahil olmuş olacak. Altta
kesikli çizgiyle göstergeç fonksiyonu görülüyor,
1
Diğer kavisli çizgiler ise − log(−u) t1 , her t için farklı bir eğri. t büyütüldükçe log
bariyer fonksiyonunu göstergeci daha da iyi yaklaşık temsil etmeye başlıyor /
ona yaklaşıyor [1, 17:08].
Altta farklı µ değerleri için −µ log(−u) fonksiyonun değerlerini görüyoruz. Fonksiyon
görüldüğü gibi I’ya oldukca yakın.
def I(u):
if u<0: return 0.
else: return 10.0
u = np.linspace(-3,1,100)
Is = np.array([I(x) for x in u])
import pandas as pd
df = pd.DataFrame(index=u)
df['I'] = Is
df['$\mu$=0.5'] = -0.5*np.log(-u)
df['$\mu$=1.0'] = -1.0*np.log(-u)
df['$\mu$=2.0'] = -2.0*np.log(-u)
df.plot()
plt.savefig('func_59_barr_02.png')
1X
m
min f(x) + log(−hi (x))
x t i=1
ki t büyük olacak şekilde çünkü o zaman log, göstergeci iyi yaklaşık olarak tem-
sil ediyor, ardından bu yeni pürüzsüz problemi çözüyoruz, eşitsizlik şartlarına
2
ihtiyaç duymadan.
Log-Bariyer Calculus
φ fonksiyonunun bazı özelliklerini dökmek faydalı olur, ileride Newton meto-
tundan bahsettiğimizde bu özellikler faydalı olacak. φ için gradyan ve Hessian,
X
m
1
∇φ(x) = − ∇hi (x)
i=1
hi (x)
Hessian
X
m X
m
1
2
∇ φ(x) = ∇hi (x)∇hi (x) − T
∇2 hi (x)
i=1 i=1
hi (x)
Ax = b
Herneyse, merkezi yol x∗ (t), t > 0’nin bir fonksiyonudur, yani her t için eldeki
çözümlerin ortaya çıkarttığı yoldur bir bakıma. Her t için problemin çözümünü
KKT koşulları ile karakterize edebiliriz.
X 1
t∇f(x∗ (t)) − ∇hi (x∗ (t)) + AT w = 0
hi (x∗ (t))
Eğer x’e göre gradyan alıp sıfıra eşitlersek durağanlığı elde ederim. Gradyan
yeterli çünkü buradaki tüm fonksiyonlar dışbükey ve pürüzsüz [1, 24:04].
3
Eğer üstteki problemi bir w için çözersem o zaman merkezi yoldaki bir çözümü
belli bir t için karakterize etmiş / tarif etmiş oluyorum. Umudumuz o ki t’yi son-
suzluğa doğru büyüttükçe üstteki KKT koşullarıyla temsil edilen çözümler ori-
jinal problemimdeki çözüme yaklaşmaya başlayacak. Bu olabilir değil mi? t’yi
büyüttükçe log bariyerin nasıl göstergeç fonksiyonuna benzemeye başladığını bi-
raz önce gördük. Bu tür log bariyerlerden oluşan optimizasyon problemi için de
benzer bir durum olacağını tahmin edebiliriz.
Bu kavramları lineer programlar için yakından görebiliriz. Tüm bu yaklaşımlar
bu arada ilk başta LP’ler için ortaya atılmıştır.
Önemli bir örnek,
X
m
T
min tc x − log(ei − dTi x)
x
i=1
X
m
1
0 = tc − di
i=1
ei − dTt x( t)
4
cT x∗ (t)} hiper düzlemi φ’nin x∗ (t)’deki konturuna teğet durmalıdır [1, 28:12].
Ikiz noktalar
Birazdan merkezi yoldan ikiz noktalar alabileceğimizi göreceğiz. Bu çok faydalı
olacak çünkü bu ikiz noktaları bir ikiz boşluğu hesaplamak için kullanacağız.
Merkezi yoldayken bu yoldaki noktalar x ∗ (t)’leri kullanarak olurlu ikiz nok-
talar hesaplayabiliriz. Orijinal probleme tekrar bakarsak, bu problem için ikiz
değişkenleri elde etmek için her eşitsizlik için bir ui ’ye, her eşitlik şartı için bir
vi ’ya ihtiyacım var. Onları nasıl tanımlarım? Merkezi yol üzerindeki çözümler
üzerinden,
1
u∗i (t) = , i = 1, .., m, v∗ (t) = w/t
thi (x∗ (t))
w bariyer problemi için KKT koşullarını çözerken elde ettiğim değişken idi.
Niye üsttekiler orijinal problem için olurlu? Bunu görmek kolay, ilk önce, u∗i (t)’nin
her ögesi harfiyen pozitif, çünkü hi (x∗ (t))’nin her ögesi harfiyen negatif. Bu
bariyer probleminin ana olurluk şartından geliyor. Ayrıca (u∗ (t), v∗ (t)) Lagrange
ikiz fonksiyonu g(u, v)’nin tanım kümesinde (domain). Hatırlarsak Lagrange ik-
izi formülize ettiğimizde tanım kümesinde bazı dolaylı sınırlamalar elde ediyor-
duk. Tarif itibariyle
X
m
∗
∇f(x (t)) + ui (x∗ (t))∇hi (x∗ (t)) + AT v∗ (t) = 0
i=1
Yani x∗ (t), Lagrangian L(x, u∗ (t), v∗ (t))’i tüm x’ler üzerinden minimize edeceği
için g(u∗ (t), v∗ (t)) > −∞. Bu direk durağanlık şartından geliyor işte. O kadar
bariz birşey ki aslında bazen kafa karıştırıyor. Merkezi yol probleminden çözdüğümüz
durağanlık koşulu şöyleydi,
X 1
t∇f(x∗ (t)) − ∗
∇hi (x∗ (t)) + AT w = 0
hi (x (t))
X 1 w
∇f(x∗ (t)) − ∗
∇hi (x∗ (t)) + AT = 0
thi (x (t)) t
X −1 T w
∇f(x∗ (t)) + ∇h i (x∗
(t)) + A =0 (4)
thi (x∗ (t)) t
|{z}
| {z }
ui v
5
desem, orijinal problemin durağanlık şartına benzeyen bir ifade elde etmiş olu-
rum [2, 33:48]. Demiştik ki üstteki ui , v tanımları üzerinden orijinal problem için
olurlu ikiz noktaları alabiliyoruz.
Soru: niye orijinal problem için optimal noktaları elde etmedim? Biraz önce
gördük, durağanlık koşulunu tatmin ettim, ana, ikiz olurluk var.. ama.. tamam-
layıcı gevşeklik tatmin edilmedi. Çok önemli. Onun yerine ne var? ui hi (x) = 0
olması lazım, onun yerine ne var? Tanım itibariyle ui = −1/t.. var. O zaman
sıfıra yakınsak çok yakınsak bölüm büyür, dolaylı olarak t’yi büyüttükçe orijial
problemin KKT koşullarını yaklaşıksallamış oluruz. O zaman log bariyer prob-
lemini çözmüş olmamıza rağmen belli bir t değer için orijinal problem için çözüm
olmamasının sebebi tamamlayıcı gevşekliğin tatmin edilmiyor olması.
Ama elimizdekiler hala çok faydalı, çünkü herhangi bir anda merkez yol üzerinde
t’nin fonksiyonu olarak ne kadar alt optimal olduğumuzu sınırlamak mümkün
oluyor. Bunun için sadece ikiz boşluğunu hesaplıyoruz, o kadar. O zaman u∗ , v∗ ’da
Lagrange ikiz fonksiyonu hesaplıyorum, ve f∗ ile bu Lagrange farkını buluyo-
rum, ve ikiz boşluğu hesaplanmış oluyor. (4)’te gördük ki x∗ Lagrangian’i u∗ , v∗ ’da
minimize eder, o zaman ikizi alttaki gibi hesaplayarak
X
m
g(u∗ (t), v∗ (t)) = f(x∗ (t)) + u∗i (t)hi (x∗ (t)) + v∗ (t)T (Ax∗ (t) − b)
i=1
Büyük toplamdaki ikinci terim sıfır, çünkü merkezi yolda Ax∗ her zaman b’ye
eşittir. Birince terimde, ui ’i −1/t’ye eşitledik, ve bu m kere toplanacak, sonuç
Yani göstermiş olduk ki merkezi yolun optimallikten olan uzaklığı en fazla m/t
olacaktır,
Üstteki bariyer metorun işlediğine dair ispata en yakın sonuç, bize diyor ki eğer
herhangi bir t için bariyer problemini çözersem optimalliğe yakınlık her zaman
m/t’den küçük olur. t’yi isteğe bağlı olarak büyüttükçe o ölçüde optimalliğe
yaklaşmış olurum.
Merkezi yolu yorumlamanın bir diğer yolu “sarsıma uğratılmış KKT koşulları”
denen bir teknik üzerinden. Şimdiye kadar gördük ki merkez yol ve ona tekabül
eden ikiz değerler (4)’teki durağanlık şartını çözüyor. ui > 0, hi (x) 6 0, ve Ax =
b. Tamamlayıcı gevşeklik haricinde tüm koşullar tatmin. Esas KKT koşullarında
6
olurdu, biz onun yerine
dedik. Yani bir anlamda log bariyer fonksiyonunu unutuyoruz, onun yerine şu
probleme bakıyoruz,
X
m
∗
∇f(x (t)) + ui (x∗ (t))∇hi (x∗ (t)) + AT v∗ (t) = 0
i=1
m
f(x( k)) − f∗ 6
µk t0
log(m/(t(0) ))
log µ
7
tane merkezleştirme adımına ihtiyacımız var.
Olurluk metotu (feasibility method)
Bariyer metotunun bir noktadan başlaması gerekir ve bu nokta olurlu olmalıdır.
Olurlu derken
şartlarına uyan bir noktadan bahsediyorum. Fakat ya öyle bir nokta elimizde
yoksa? Başta olurlu olan bir noktayı bulmanın kendisi de zor bir problem. Böyle
bir noktayı elde etmek için olurluk metotu denen bir yöntem kullanmak gereke-
cek. Boyd’un kitabı [4, Bölüm 11] bu metota “1. Faz (Phase I)” ismi veriyor, prob-
lemin kendisini çözmeye “2. Faz” diyor. Pratikte bariyer metotunu kullanmak
isteyenler bunu hatırlamalı.
Harfiyen olurlu bir noktayı nasıl buluruz? Kulağa biraz dolambaçlı gibi gelebilir
ama bu noktayı bulmak için ayrı, farklı bir optimizasyon problemi daha kurarız,
onu da bariyer metotu ile çözeriz. Tabii illa bariyer metotu olması gerekmez,
ana-çift iç-nokta yöntemi de olabilir, ama her halükarda alttaki problemi çözeriz.
Bu problemde elimizde iki tane değişken grubu var, x, s. Problem [2, 23:02],
min s öyle ki
x,s
hi (x) 6 s, i = 1, .., m
Ax = b
Amaç harfiyen negatif bir s elde etmek, böylece hi (x) 6 s üzerinden ana prob-
lemin eşitsizlik şartları tatmin olacak, ayrıca Ax = b’e uygun bir başlangıç noktası
elde edilmiş olacak ki bu da ana problem için gerekli.
Bu problemi bariyer metotu ile çözmek oldukca kolay, ana problemin kendisi
kadar zor değil. Niye? İki sebep: ilki, üstteki problemi çözmek için de harfiyen
olurlu bir başlangı noktası lazım, ama bu noktayı bulmak aslında çok kolay. Bana
tek gereken eşitlik kısıtlaması Ax = b’yi tatmin eden bir x bulmak, ama bu lineer
bir sistem çözümü, her lineer cebir paketi bunu çözer. Ardından elde edilen x
ile hi (x)’i hesaplamak, ve bunların en büyüğünü artı mesela 0.01 diyerek kullan-
mak [2, 24:00]. Elde edeceğimiz sonuç üstteki problem için harfiyen olurludur,
eşitsizlik kısıtlamalarına harfiyen uygun. Şimdi elimde bir başlangıç x’i ve s’i var,
ve buradan başlayarak bariyer metotunun adımlarını uygulayabilirim. İşin güzel
tarafı durma şartımız çok basit, s’in her ögesinin negatif olduğunu gördüğüm
anda şak diye durabilirim, yani üstteki programın “optimal” olmasıyla ilgilen-
miyorum sonuçta bana tek gereken ana problemim için olurlu bir başlangıç nok-
tası. Çoğunlukla yapılan tarif edilen şekilde x, s bulmak ve bunu ardı ardına yap-
mak ta ki tamamen negatif elde edilene kadar ve o noktada durulur, ana prob-
leme dönülür.
8
Alternatif olarak şu problem de çözülebilir,
min 1T s, öyle ki
x,s
hi (x) 6 si , i = 1, .., m
Ax = b, s > 0
Bu metotun avantajı eğer sistem olurlu değilse hangi kısıtlamanın harfiyen yerine
getirilemediğini bize söyler. Dezavantaj çözmesinin biraz daha zor olabilmesi.
Ekler
Bir diğer başlangıç noktası bulma metotu, Faz I yaklaşımı daha [5]. Burada
min t, öyle ki
Ax = b, x > (1 − t)1, t>0
z = x + t~1 − ~1
Ya da
x = z − t~1 + ~1
Az − At~1 = b − A~1
Eşitliğin solundakiler yerine x’i genişletip t için yeni bir hücre yaratabiliriz, ve
A’ya yeni kolon ekleriz, bu kolondaki her öge mevcut A’nin satırlarının toplamının
negatifi olur. Bedel vektörü de c = [0, 0, ..., 1] haline gelir, son öğe t için.
9
Standard LP çözen bariyer metot temelli [3] kod alttadır.
import numpy as np
def lp_acent(A,b,c,x_0):
b = b.flatten()
c = c.flatten()
ALPHA = 0.01
BETA = 0.5
EPSILON = 1e-6
MAXITERS = 100
if (np.min(x_0)<=0) and (np.linalg.norm>1e-3):
print ('failed' )
return 0
lambda_hist = []
x = x_0
for iter in range(MAXITERS):
g = c-np.power(x,-1)
w = np.linalg.solve(np.dot(np.dot(A,np.diag(np.power(x,2))),A.T),
np.dot(np.dot(-A,np.diag(np.power(x,2))),g))
dx = np.dot(-np.diag(np.power(x,2)),np.dot(A.T,w)+g)
lambdasqr = np.dot(-g.T,dx)
lambda_hist.append(lambdasqr/2)
if lambdasqr/2 <= EPSILON:
break
t = 1
while np.min(x+t*dx)<=0:
t =BETA*t
while np.dot(c.T,np.dot(t,dx))- \
np.sum(np.log(x+t*dx))+np.sum(np.log(x))-\
ALPHA*t*np.dot(g.T,dx)>0:
t = BETA*t
x = x+t*dx
if iter == MAXITERS:
print ('ERROR: MAXITERS reached')
else:
return x,w,lambda_hist
def lp_barrier(A,b,c,x_0):
T_0 =1
MU = 20
EPSILON = 1e-3
n = len(x_0)
t = T_0
x = x_0.flatten()
history = []
while True:
x_star, nu_star,lambda_hist = lp_acent(A,b,t*c,x)
x = x_star
gap = n/t
history.append(lambda_hist)
if gap<EPSILON:
break
t = MU*t
return x_star,nu_star,gap
10
def lp_solve(A,b,c):
m,n = A.shape
nsteps = np.zeros((2,1))
x0 = np.linalg.lstsq(A,b)[0]
t0 = 2+np.max([0,-np.min(x0)])
if np.min(x0)>0.0:
print ('Ax=b solution already feasible')
x_0 = x0
else:
print ("phase I")
A1 = np.hstack((A,np.dot(-A,np.ones((n,1)))))
b1 = b-np.dot(A,np.ones((n,1)))
z0 = x0+t0*np.ones((n,1))-np.ones((n,1))
c1 = np.vstack((np.zeros((n,1)),1))
z_star,nu_star,gap = lp_barrier(A1,b1,c1,np.vstack((z0,t0)))
if z_star[n] >= 1:
print ('Problem is infeasible')
exit()
x_0 = z_star[0:n]-(z_star[n]*np.ones((n,1))).flatten()+\
np.ones((n,1)).flatten()
x_star,nu_star,gap = lp_barrier(A,b,c,x_0)
return x_star,gap,nsteps
Örnek olarak uyduruk bir problem seçtik, problem özellikle başta olurlu nokta
bulamayacak şekilde ayarlandı, böylece gidip kendimizin bulması gerekiyor.
import numpy as np
from scipy.optimize import linprog
import barr
import barr
A = np.array(A)
b = np.array(b).T
c = np.array(c).T
x_star,gap,nsteps = barr.lp_solve(A,b,c)
phase I
11
[[1.44060995]
[3.1918138 ]
[3.37720706]
[1. ]
[2.00321027]]
log bariyer ==========
[4.37502314e-01 2.18747454e+00 2.37502314e+00 7.40628401e-05]
linprog ===============
con: array([ 2.05213624e-11, 2.05719886e-11, -9.18283227e-11])
fun: -11.37499999994356
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([4.3750000e-01, 2.1875000e+00, 2.3750000e+00, 1.0991855e-11])
A = np.array([[1, 1, 1, 0],
[1, 3, 0, 1]])
b = np.array([5,7])
c = np.array([-1, -5, 0, 0 ])
A = np.array(A)
b = np.array(b).T
c = np.array(c).T
x_star,gap,nsteps = barr.lp_solve(A,b,c)
12
Bu durumda Ax0 = b çözümü başlangıç için yeterliydi ve o kullanıldı.
Gradyan ve Hessian
Pek çok yerde kullanılan bir eşitsizlik görelim, mesela bütün xi < 0 olduğu bir
durum, yani hi (x) = −x. O zaman bariyer neye benzer?
X
n
φ(x) = − log xi
i=1
1/x1
∇φ(x) = − ... = −X−1~1
1/xn
Burada X matrisi
x1
X = diag(x) =
..
.
xn
Eski Anlatım
X
m
min f(x) + I(ci (x))
x
i=1
13
ki I pozitif reel fonksiyonlar için göstergeç fonksiyonu,
0 u60
I(u) =
∞ u>0
X
m
− log ci (x)
i=1
X
m
P(x; µ) = f(x) − µ log ci (x)
i=1
14
P(x; µ) = (x1 + 0.5)2 + (x2 − 0.5)2 − µ log x1 + log(1 − x1 ) + log x2 + log(1 − x2 )
x = np.array([0.8,0.2])
mu = 2.0
for i in range(10):
def P(x):
x1,x2=x[0],x[1]
return (x1+0.5)**2 + (x2-0.5)**2 - mu * \
(anp.log(x1) + anp.log(1-x1) + anp.log(x2)+anp.log(1-x2))
h = hessian(P)
j = jacobian(P)
J = j(np.array(x))
H = h(np.array(x))
d = np.dot(-lin.inv(H), J)
x = x + d
print (i, x, np.round(mu,5))
mu = mu*0.1
15
[2] Tibshirani, Convex Optimization, Lecture Video 15, Part 2, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] Bao, LP-Solver, Github, https://github.com/rayjim/python_proj/blob/
master/hm_8/lp_solver.py
[4] Boyd, Convex Optimization
[5] Boyd, Convex Optimization, Solutions to additional exercises
16
Ana-Çift İç Nokta Metotları (Primal-Dual Interior-Point Methods)
Şimdiye kadar gördüğümüz problem tiplerini hatırlayalım şimdi ve çözme zorluğu
açısından sıralayalım. En üstte, en basit olan karesel problemlerdi,
1
min xT Qx + cT x
x 2
1
bazen ikiz olurlu noktalar bile mevcut olmayabilir, bu daha ciddi bir durum.
Hatırlarsak bariyer metotunda ikiz olurlu nokta her zaman vardı ve bu noktayı
bir ikiz boşluğu hesaplamak için kullanabiliyorduk. Bu boşluğu hesaplamak ko-
laydı, her noktada m/t < değerindeydi.
O zaman ana-çift ile bu hesap yoksa, ne zaman duracağımızı tam bilmiyoruz de-
mektir, demek ki akıllıca uydurma (heuristic) yaparak bir durma şartı bulmamız
lazım.
Pozitif bağlamda ana-çift metotları daha verimli çalışır. İspatına girmeyeceğiz
ama ana-çift yakınsaması lineerden daha iyidir.
Negatif olarak ana-çift metotlarını kabaca, sezgisel kavramak bariyer metotu kadar
direk olmayabilir. Şahsen bu alanda araştırmacı olan ben bile ana-çift metot
adımlarının temelii hatırlamakta bazen zorlanıyorum, bariyer metotunu hatırlamak
basit, kısıtlamanın log’unu alıp kritere ekliyorsunuz, sonra Newton metotu uygu-
luyorsunuz [1, 13:35].
Detaylara gelelim. KKT koşul sarsımını hatırlarsak, bariyer metotunu KKT koşullarında
bir sarsım olarak görebiliyorduk, şu ifadelerde
X
m
∇f(x) + ui ∇hi + AT v = 0 (1)
i=1
hi (x) 6 0, i = 1, .., m, Ax = b
ui > 0
Bu problemin KKT şartları görülen blokta, durağanlık için gradyan alıp sıfıra
eşitlenir, (1) elde edilir, tabii f, hi ’in pürüzsüz ve dışbükey olduğu farz edilir, o
2
sebeple gradyan yeterli, altgradyana gerek yok, vs. Tek değiştirdiğimiz tamam-
layıcı gevşeklik ve onun artık sıfıra eşit olmasını şart koşmuyorum, ufak başka
bir değere, ve doğru işarete sahip olan başka bir değere eşit olmasını zorluyorum,
ui · hi (x) = (−1/t) şartı bu. 1/t gibi bir değerin sebebi aslında log(x)’in türevinin
1/ log(x) olmasıyla alakalı, çünkü log bariyerleştirilmiş kriterin türevini alıp sıfıra
eşitleyince ve ikiz değişkenleri uygun şekilde tanımlayınca log bariyer meto-
tunun orijinal KKT koşulları yerine üstteki şekilde bir problemi çözülebildiğini
görmüştük [1, 16:19], ve t büyütüldükçe görülen değiştirilmiş tamamlayıcı gevşeklik
esas versiyonuna daha da yaklaşıyordu.
Ana-çift metotlarına erişmenin bir diğer yolu sarsımın ortaya çıkarttığı denklem-
leri birarada çözmek ve Newton adımını ona göre atmak [1, 22:55].
Denklemler ayrı ayrı olarak
rprim = Ax − b
∇f(x) + Dh(x)T u + AT v
r(x, u, v) = − diag(u)h(x) − 1/t (3)
Ax − b
ki
h1 (x) Dh1 (x)T
h(x) = . . . Dh(x) = ... (4)
T
hm (x) Dhm (x)
∆x
≈ r(x, u, v) + Dr(x, u, v) ∆u
∆v
3
Üstteki denklemde (3) ve (4) öğelerini kullanarak özyineli şekilde dönersem gayrı-
lineer denklemi çözmüş olurum. Notasyonu biraz degistirirsek, y = (x, u, v) ile,
0 ≈ F(y) + DF(y)∆y
−F(y) = DF(y)∆y
∆y = −(DF(y))−1 F(y)
Ya da
DF(y)∆y = −F(y)
Dr(y)∆y = −r(y)
O zaman (3)’teki r(y)’nin türevi, yani Jacobian’ı gerekiyor. Üsttekini şöyle yazıyoruz,
P
∇2 f(x) + m 2
i=1 ui ∇ hi (x) Dh(x)T AT ∆x rdual
− diag(u)Dh(x) − diag(h(x)) 0 ∆y = rcent (5)
A 0 0 ∆v rprim
Büyük Jacobian’ı nasıl elde ettik? Mesela (3)’ün ilk satırına bakalım,
∇f(x) + Dh(x)T u + AT v
var, onun x, u, v’ye göre türevlerini almak bize iki üstteki matrisin 1. satır 1. 2.
ve 3. kolonunu veriyor, mesela x’e göre türev alınca bir Pmüstteki2 ifadede 1. ve
T 2
2. terimin türevi alınır, A v yokolur, bu bize ∇ f(x) + i=1 ui ∇ hi (x) verir [1,
4
28:43]. Aynı şekilde devam edersek görülen matrisi elde ederiz. Tüm sistemi ∆y
için çözünce de istediğimiz Newton yönünü elde ederiz.
Bu yönteme ana-çift denmesinin sebebi üstte görülüyor aslında, çünkü dikkat ed-
ersek hem ana hem ikiz değişkenleri aynı sistemde, aynı anda çözüyoruz. Değil
mi? Denklem sistemi KKT koşularının formülize edilmesinden geldi, ve bu koşullarda
ana ve ikiz değişkenler aynı yerde mevcuttur, ve çözerken tüm x, u, v için çözüyoruz.
Not: Bu yaklaşımla bariyer metotuna erişmek mümkün, o durumda sistemden u
çıkartılır, ve geri kalanlar çözülür.
Metotu algoritmik olarak görmeden önce bir konudan daha bahsetmek istiyo-
rum; alternatif ikizlik boşluğu. Bu gerçek ikizlik boşluğu değil, çünkü daha önce
belirttiğimiz gibi bu metotta ikiz değişkenler her zaman olurlu olmayabiliyor.
Bariyer metotu için ikizlik boşluğu basitti, m/t çünkü ui = −1/(thi (x)), i =
1, .., m tanımlamıştık ve bu ikiz olurlu idi. Alternatif boşluk için sanki ikiz olurluk
varmış gibi yapıyoruz, ve
X
m
η = −h(x)T u = − ui hi (x)
i=1
hesabını yapıyoruz. Eğer üstteki hesabı bariyer problemi için yapıyor olsaydık,
ui = −1/t tanımlamış olacaktık ve o zaman bariyer metotu için olan boşluğu
elde edecektik. Ana-çift yönteminde böyle değil tabii, sistemi çözerken ui için de
çözüm yapıyoruz, onu önceden tanımlamıyoruz, fakat üstteki formu kullanarak
alternatif ikizlik boşluğunu elde edebiliriz. η her zaman pozitif olacak, çünkü
kendimizi her zaman hi (x) 6 0 olacak şekilde kısıtlayacağız, ve ui > 0 zaten, o
zaman çarpımlarının ekşi ile çarpılması pozitif sonuç verir.
Tüm bunları durma şartı için nasıl kullanırız? Her ne kadar ui ’lar olurlu olmaya-
bilse bile yine de boşluğu hesaplıyoruz, ardından ikiz değişkenlerin olurluğa ne
kadar yakın olduğunu ayrı bir yerde hesaplıyoruz. Yani eğer alternatif boşluk
az, ve olurluğa yakınlık varsa, akıllıca bir uydurma ile kullanarak durma / dur-
mama kararı verebiliriz. Gerçi bu teknik uydurmadan biraz daha iyi aslında, ana-
çift metotunun yakınsadığına dair matematiksel ispatlar var, fakat terminolojik
olarak bu boşluk hesabı gerçek bir boşluk hesabı değil.
Artık metotu tanımlayabiliriz. Bir harfiyen olurlu x(0) ile başla, yani bu nokta
hi (x(0) ) < 0, ve Ax(0) = b. Ayrıca u(0) > 0, v(0) herhangi bir değer. Alternatif
ikizlik boşluğu η(0) = −h(x(0) )T u(0) olarak tanımla [1, 45:21].
t’yi büyütmek için µ > 1 kullanıyoruz. Her döngü sonunda eski t’yi µ ile çarpıp
yeni t elde edeceğiz.
Adımlar
1) t = µm/η(k−1) tanımla.
2) Ana-çift güncelleme yönü ∆y’yi hesapla (nasıl yapılacağını gördük, (5)’teki
5
lineer sistemi çözerek).
3) Geri iz sürme (backtracking) tekniği ile adım büyüklüğü s’yi hesapla (birazdan
nasıl yapılacağını göreceğiz)
4) y(k) = y(k−1) +s·∆y ile y’yi güncelle. Yani bu hesapla tüm ana, ikiz değişkenleri
güncellemiş oluyoruz, x, u, v.
5) Alternatif ikizlik boşluğunu hesapla η(k) = −h(x(k) )T u(k) .
6) Ana ve ikiz artıklar ufak ise, yani eğer η(k) < ise ve (||rprim ||22 + ||rdual ||22 )1/2 <
ise dur.
rprim hatırlarsak eşitlik sınırlamasından ne kadar uzak olduğumüz. rdual ise
durağanlık şartıydı, onun sıfırdan ne kadar uzak olduğuydu. Niye ona “ikiz
(dual)” etiketi verdik? Bunun ikiz olurluk ile ne alakası var? Burada biraz nüans
var..
Not: artık kelimesini kullandık daha önce rdual ikiz artık, rprim ana artık.
Hatırlarsak u, v üzerindeki kısıtlamalar nelerdi? u > 0, ve v herhangi bir şey
olabilir. Ama dolaylı bir kısıtlama daha var aslında, o da u, v’nin Lagrange iki
fonksiyonunun tanım alanında olma zorunluluğu.. Ve bu kısıtlamalar işte (6)’dan
başlayan üç denklemde aslında belirtiliyor. Yani, çünkü eğer alttaki sıfır ise
∇f(x) + Dh(x)T u + AT v = 0
bu sadece ve sadece doğru olabilir x eğer x üzerinden L(x, u, v)’i minimize ediy-
orsa. Ki bu durumda
g(u, v) = L(x, u, v)
doğru olur. Yani x Lagrangian’ı minimize ediyorsa, tanım itibariyle L(x, u, v) eksi
sonsuzluk değildir. Değil mi? Çünkü eksi sonsuzluğa gidiş olmasın diye ik-
izde spesifik kısıtlamalar getirdik. Ve bu da demektir ki u, v Lagrangian’ın tanım
alanında olmalı.
Geriye İz Sürme
Üstteki algoritmada #4 adımında bir adım atıldığını gördük, fakat bu adım atılırken
s’nin nasıl bulunacağını anlatmadık. Adım atılırken y+ = y + s∆y ile, hi (x) 6 0,
ve ui (x) > 0 şartlarının hala geçerli olmasını garantilemek istiyoruz, ve s’yi bu
olacak şekilde seçeceğiz. Tabii y+ = y + s∆y derken
x+ = x + s∆y
u+ = u + s∆y
6
v+ = v + s∆y
demek istiyoruz. Bu seçim şöyle yapılabilir, önce s’yi her öge için ui > 0, i =
1, .., m olacak sekide mümkün en büyük adımdan başlarız. Bu çözüm kolaydır,
çünkü her ui için her ∆ui bizi sıfıra yaklaştırıyor mu, eğer yaklaştırıyorsa sıfıra
gelmeden ne kadar uzağa gidebiliriz sorusunuz sorabiliriz, ve tüm bu uzaklıklar
arasından en ufak olanı s seçimi için başlayacağımız en büyük uzaklık olacaktır.
Matematiksel olarak
smax = min 1, min{−ui /∆ui : ∆ui < 0}
Tabii harfiyen olurluk istiyoruz, yani u > 0 o zaman bulunan büyüklüğün 0.999’ü
kadarını alırız. Bu değeri alınca oradan “geriye iz sürmeye” başlarız, yani küçülte
küçülte bu sefer h şartlarını da tatmin eden bir s aramaya başlayabiliriz. Bu ara-
mayı yaparken u işaretini tatmin edeceğimizden eminizdir çünkü en büyük s’yi
özellikle u için ayarladık.
Döngünün bu aşamasında her küçültme sonrası alttaki şartları da kontrol edeceğiz,
şu şekilde;
s = βs yap, ta ki
1 - hi (x+ ) < 0, i = 1, .., m.
2 - ||r(x+ , u+ , v+ )||2 6 (1 − αs)||r(x, u, v)||2
olana kadar. 2. şartta eşitsizliğin sol tarafı sarsıma uğratılmış KKT koşulları, onu
1 − αs oranında azaltıyorum.
Ya da şu şekilde bakabiliriz, 1. kontrolda s’i ana olurluk tatmin oluncaya kadar
azalt. Ondan sonra 2. adım üzerinden normal geriye iz sürme gerçekleştir.
Artik elimizde ana-cift metotunu kodlamak icin gereken her sey var. Bir ornek
uzerinde gorelim, standart form LP.
min cT x, öyle ki
x
Ax = b
x>0
ki c ∈ Rn , A ∈ Rm×n , b ∈ Rm .
Ikiz
max öyle ki
u,v
AT u + u = c
7
u>0
AT v + u = c
xi ui = 0, i = 1, .., n
Ax = b
x, u > 0
İç-nokta yöntemleri ilk ve son iki şarta uyacak şekilde ayarlanır ve döngü içinde
yavaş yavaş 2. şartı yerine getirmeye uğraşır [2, 13:47].
8
Sarsıma uğratılmış KKT şartları, üstteki formülde tamamlayıcı gevşeklik için eşitlikte
1/t kullanarak elde edilir,
AT v + u = c
xi ui = 1/t, i = 1, .., n
Ax = b
x, u > 0
0 = rpd (x, u, v)
AT v + u − c
= diag(x)u − (1/t)
Ax − b
0 I AT ∆x
diag(u) diag(x) 0 ∆u = −rpd (x, u, v)
A 0 0 ∆v
Güncelleme için her t ile tek bir adım atıyorum,m adım y+ = y + ∆s (tabii s > 0
için çizgi araması yaparak) ama tek bir kez. Sonra t = µt ile t’yi güncelliyorum
[1, 18:13].
Ekler
LP Kodu
Altta şimdiye kadar anlatılan metotlar ile çözüm yapan ve sonucu linprog çağrısı
ile karşılaştıran bir kod [5] görüyoruz. Çözülen problem [4, sf. 209]
x1 + x2 + x3 = 5
x1 + 3x2 + x4 = 7
x1 , x2 , x3 , x4 > 0
9
import numpy as np
from scipy.optimize import linprog
from numpy.linalg import matrix_rank
m = A.shape[0]
n = A.shape[1]
x = np.ones(shape=(n, ))
l = np.ones(shape=(m, ))
s = np.ones(shape=(n, ))
k = 0
A_ = np.zeros(shape=(m + n + n, n + m + n))
A_[0:m, 0:n] = np.copy(A)
A_[m:m + n, n:n + m] = np.copy(A.T)
A_[m:m + n, n + m:n + m + n] = np.eye(n)
A_[m + n:m + n + n, 0:n] = np.copy(np.diag(s))
A_[m + n:m + n + n, n + m:n + m + n] = np.copy(np.diag(x))
b_ = np.zeros(shape=(n + m + n, ))
b_[0:m] = np.copy(b - np.dot(A, x))
b_[m:m + n] = np.copy(c - np.dot(A.T, l) - s)
tmp = np.dot(np.dot(np.diag(x), np.diag(s)), np.ones(shape=(n, )))
b_[m + n:m + n + n] = np.copy( sigma_k * mu_k * np.ones(shape=(n, )) - tmp )
alpha_max = 1.0
for i in range(n):
if delta_x[i] < 0:
alpha_max = min(alpha_max, -x[i]/delta_x[i])
if delta_s[i] < 0:
alpha_max = min(alpha_max, -s[i]/delta_s[i])
eta_k = 0.99
alpha_k = min(1.0, eta_k * alpha_max)
10
x = x + alpha_k * delta_x
l = l + alpha_k * delta_l
s = s + alpha_k * delta_s
diff = np.dot(A, x) - b
print('Ax - b = {}; ideally it should have been zero vector'.format(diff))
print('norm of Ax - b is = {}; ideally it should have been zero'.format
(np.linalg.norm(diff)))
return x
A = np.array([[1, 1, 1, 0],
[1, 3, 0, 1]])
b = np.array([5,7])
c = np.array([-1, -5, 0, 0 ])
res = solve(c,A,b)
print (res)
print (res)
iteration #1; primal_obj = -6.00000, dual_obj = 12.00000; duality_gap = -18.00000
iteration #2; primal_obj = -9.21750, dual_obj = -1.11750; duality_gap = -8.10000
iteration #3; primal_obj = -11.15521, dual_obj = -9.33695; duality_gap = -1.81826
iteration #4; primal_obj = -11.60327, dual_obj = -11.70816; duality_gap = 0.10489
iteration #5; primal_obj = -11.64091, dual_obj = -11.69203; duality_gap = 0.05113
iteration #6; primal_obj = -11.65622, dual_obj = -11.67707; duality_gap = 0.02084
iteration #7; primal_obj = -11.66243, dual_obj = -11.67089; duality_gap = 0.00846
iteration #8; primal_obj = -11.66495, dual_obj = -11.66838; duality_gap = 0.00344
iteration #9; primal_obj = -11.66597, dual_obj = -11.66736; duality_gap = 0.00140
iteration #10; primal_obj = -11.66638, dual_obj = -11.66695; duality_gap = 0.00057
iteration #11; primal_obj = -11.66655, dual_obj = -11.66678; duality_gap = 0.00023
Ax - b = [0. 0.]; ideally it should have been zero vector
norm of Ax - b is = 0.0; ideally it should have been zero
[3.50107272e-05 2.33331700e+00 2.66664799e+00 1.40040490e-05]
Primal Feasibility Dual Feasibility Duality Gap Step Path Para
1.0 1.0 1.0 - 1.0
0.1105388427842 0.1105388427842 0.1105388427842 0.8919387648961 0.1105388
0.001400532337055 0.00140053233704 0.00140053233704 0.9918943193656 0.0014005
7.115191880125e-08 7.11519194345e-08 7.115191920093e-08 0.9999491966235 7.1151920
3.556266503391e-12 3.557079864332e-12 3.557332206583e-12 0.9999500067836 3.5575959
Optimization terminated successfully.
Current function value: -11.666667
Iterations: 4
con: array([1.18571819e-11, 1.18527410e-11])
fun: -11.66666666664022
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([1.15454732e-13, 2.33333333e+00, 2.66666667e+00, 3.96953400e-12])
11
QP Kodu
[3]’den odev sorusu 11.24 cozumu olarak altta ana-çift yöntemi ile bir QP nasıl
çözülür görüyoruz. QP şu formda,
min(1/2)xT Px + qT x öyle ki
x
Ax 6 b
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as lin
import scipy.linalg as slin
MAXITERS = 200;
TOL = 1e-6;
m=3;n = 3
RESTOL = 1e-8;
MU = 10;
ALPHA = 0.01;
BETA = 0.5;
x = np.zeros((n,1));
b = np.ones((n,1))*10.
q = np.ones((n,1))*3.
s = b-np.dot(A,x);
z = 1./s;
12
step = np.min([1.0, 0.99/np.max(-dz/z)]);
while (np.min(s+step*ds) <= 0):
step = BETA*step
print (step)
newz = z+step*dz
newx = x+step*dx
news = s+step*ds
tmp1 = np.dot(P,newx)+q+np.dot(A.T,newz)
tmp2 = newz*news-tinv
newr = np.vstack((tmp1,tmp2))
while (lin.norm(newr) > (1-ALPHA*step)*lin.norm(r)):
step = BETA*step;
newz = z+step*dz
newx = x+step*dx
news = s+step*ds
newr = np.vstack((np.dot(P,newx)+q+np.dot(A.T,newz),
newz*news-tinv))
x = x+step*dx
z = z +step*dz
s = b-np.dot(A,x)
print (x)
[[-4.50000029]
[ 2.25000012]
[-0.75000002]]
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 16 (Part 1), https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Video 16 (Part 2), https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] Boyd, Convex Optimization I, http://web.stanford.edu/class/ee364a/
[4] Wright, Linear Programming with MATLAB
[5] Kamal, Linear Program Solvers, https://github.com/hasan-kamal/Linear-
Program-Solvers
13
Tam Varyasyon ile Gürültüyü Yoketmek (Total Variation Denoising)
Bir sinyalden, görüntüden gürültüyü silmek için optimizasyon kullanılabilir. Ori-
jinal sinyal x’in y = Bx + n ile bir n gürültüsü eklenerek bozulduğu (corrupted)
farzedilebilir (B bir değişim matrisidir, tutarlı, bilinen değişimleri temsil eder) biz
eldeki y ile x’i kestirmeye uğraşırız. Fakat literatürde iyi bilindiği üzere x’i y’den
tahmin etmeye uğraşmak kötü konumlanmış (ill-posed) bir sorudur. Çözüm ola-
bilecek pek çok x bulunabilir, bu sebeple arama alanını bir şekilde daraltmak
gerekir, ve bunun için bir tür düzenlileştirme / regülarizasyon (regularization)
kullanılması şarttır [3].
Bir sayısal resimden gürültü çıkartma alanında iyi bilinen bir yöntem problemi
çift hedefli bir halde konumlandırmak [4],
X
n−1
||x − xcor ||2 , φtv (x) = |xi+1 − xi | (1)
i=1
ki µ bizim seçeceğimiz bir parametre olabilir. Çözüm için mesela Newton meto-
dunu kullanabiliriz, fakat tek bir problem var, Newton ve ona benzer diğer op-
timizasyon metotları için türev almak gerekli, fakat φtv ’deki L1-norm’unun (tek
boyutta mutlak değer fonksiyonu) x = 0’da türevi yoktur (birinci terimdeki Oklit
normunun karesi alındığı için onun iki kere türevi alınabilir). Bu durumda φtv ’yi
yaklaşık olarak temsil edebilirsek, onun da türevi alınır hale gelmesi sağlayabiliriz.
Bu yeni fonksiyona φatv diyelim,
X
n−1
p
φatv = 2 + (xi+1 ) − xi −
i=1
import numpy as np
eps = 1e-6
mu = 50.0
1
def norm_tv(x):
return np.sum(np.abs(np.diff(x)))
def norm_atv(x):
return np.sum(np.sqrt(eps + np.power(np.diff(x),2)) - eps)
xcor = np.random.randn(1000)
print (norm_tv(xcor))
print (norm_atv(xcor))
1103.2561038302395
1103.2571969067808
Üstteki fonksiyonun iki kez türevi alınabilir. Şimdi analitik şekilde devam etmeden
önce pür sayısal açıdan bir çözüme bakalım. Üstteki fonksiyonları direk kodla-
yarak ve sayısal türev üzerinden işleyebilen bir kütüphane çağrısıyla hedefi min-
imize edelim, eldeki sinyal,
import pandas as pd
df = pd.read_csv('xcor.csv',header=None)
xcor = np.reshape(np.array(df[0]), (5000,1))
plt.plot(range(len(xcor)), xcor)
plt.savefig('func_60_tvd_01.png')
x0 = np.zeros(len(xcor))
def phi(x):
return np.sum(np.power(x-xcor, 2)) + mu*norm_atv(x)
2
opts = {'maxiter': 400, 'verbose': 2}
plt.plot(range(5000), res.x)
plt.savefig('func_60_tvd_02.png')
Sonuç fena olmadı. Fakat üstteki yaklaşımın hesabı uzun sürecektir, eğer el-
deki problem hakkında bazı ek şeyler biliyorsak, bu bilgileri dahil ederek elde
edilen çözüm daha hızlı olabilir. Mesela analitik olarak türevler Jacobian ve Hes-
sian bulunabilir, Newton adımı elle kodlanabilir, ayrıca problemdeki matrislerde
muhtemel bir seyreklikten (sparsity) faydalanılabilir.
Hedef fonksiyonu, ψ(x) diyelim, için birinci ve ikinci türev,
p
f(u) = 2 + u2 −
Bu fonksiyonun 1. ve 2. türevi
3
f 0 (u) = u(2 + u−1/2 ), f 00 (u) = 2 (2 + u2 )−3/2
X
n−1
F(u1 , ..., un−1 ) = f(ui )
i=1
f 0 (u1 ) . . . f 0 (un−1 )
∇F(u) =
O zaman φatv (x) = F(Dx) diyebiliriz. Bir x vektörünü üstteki matris ile sol-
dan çarpınca öğeleri x2 − x1 x3 − x2 . . . şeklinde giden bir yeni vektör elde
edeceğimizi doğrulamak zor değil. Yine Zincirleme Kuralını uygularsak,
import pandas as pd
import scipy.sparse as sps
import scipy.sparse.linalg as slin
MU = 50.0
EPSILON = 0.001
4
ALPHA = 0.01;
BETA = 0.5;
MAXITERS = 100;
NTTOL = 1e-10;
n = len(xcor)
data = np.array([-1*np.ones(n), np.ones(n)])
diags = np.array([0, 1])
D = sps.spdiags(data, diags, n-1, n)
x = np.zeros((len(xcor),1))
x = x+t*v
plt.plot(range(n),xcor)
plt.plot(range(n),x,'r')
plt.savefig('func_60_tvd_03.png')
5
Çok daha iyi bir gürültüsüz sonuç elde ettik, üstteki bu işlem çok daha hızlı.
Görüntüden Gürültü Silmek
Aynen tek boyutlu sinyalden gürültü silebildiğimiz gibi iki boyutlu görüntüden
de gürültü silmek mümkün. Bu durumda tam varyasyon
X
m X
n
(|Ui,j − Ui−1,j | + |Ui,j − Ui,j−1 |)
i=2 j=2
olabilir, yani her pikselin bir yanindaki ve bir altındaki pikselle olan uzaklığının
L1-norm’unu almak. Üstteki hesabı yapmak için aslında yine daha önce hesapladığımız
D matrisini kullanabiliriz. Bir X imajı üzerinde DX hesabı, yani D ile soldan
çarpım dikey farklılıkları, sağdan çarpım XD ise yatay farklılıkları verecektir.
X = [[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 2, 3, 4],
[5, 6, 7, 8]]
X = np.array(X)
print (X)
n = X.shape[0]
data = np.array([-1*np.ones(n), np.ones(n)])
diags = np.array([0, 1])
D = sps.lil_matrix(sps.spdiags(data, diags, n, n))
print (D.todense())
print ('Dikey Farklilik')
print (D.dot(X))
print ('Yatay Farklilik')
print (D.transpose().dot(X.T))
6
[[1 2 3 4]
[5 6 7 8]
[1 2 3 4]
[5 6 7 8]]
[[-1. 1. 0. 0.]
[ 0. -1. 1. 0.]
[ 0. 0. -1. 1.]
[ 0. 0. 0. -1.]]
Dikey Farklilik
[[ 4. 4. 4. 4.]
[-4. -4. -4. -4.]
[ 4. 4. 4. 4.]
[-5. -6. -7. -8.]]
Yatay Farklilik
[[-1. -5. -1. -5.]
[-1. -1. -1. -1.]
[-1. -1. -1. -1.]
[-1. -1. -1. -1.]]
MU = 50.0
EPSILON = 0.001
n = 225
D = np.zeros((n,n))
idx1, idx2 = [], []
for i in range(n):
idx1.append([i,i])
if i<n-1: idx2.append([i,i+1])
idx = idx1 + idx2
ones = [1.0 for i in range(n)]
ones[n-1] = 0
negs = [-1.0 for i in range(n-1)]
negs[n-2] = 0
vals = ones + negs
7
vals = np.array(vals).astype(np.float32)
D = tf.SparseTensor(indices=idx, values=vals, dense_shape=[n, n])
Ux = tf.sparse_tensor_dense_matmul(D, x)
Uy = tf.sparse_tensor_dense_matmul(tf.sparse_transpose(D), tf.transpose(x))
Uy = tf.transpose(Uy)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
def tv(xvec):
xmat = xvec.reshape(n,n)
p = sess.run(psi, {x: xmat} )
return p
def tv_grad(xvec):
xmat = xvec.reshape(n,n)
gres = sess.run(g, {x: xmat} )
return gres
x0 = np.zeros(n*n)
xcurr = x0
N = 130
for i in range(1,N):
gcurr = tv_grad(xcurr)
gcurr /= gcurr.max()/0.3
chg = np.sum(np.abs(xcurr))
xcurr = xcurr - gcurr
xcurr /= xcurr.max()/255.0
io.imsave('lenad2.jpg', np.reshape(xcurr,(n,n)))
8
Yine total varyasyon kullanan ama farklı optimizasyon çözücüyle hesabı yapan
bir yöntem tlv_prim_dual.py kodunda [1], sonuç (soldaki)
Ayrıca cvxpy adlı bir paket üzerinden aynı şeyi kodlayabiliriz, yani
1X X
n
minn (yi − βi )2 + λ |βi − βj |
β∈R 2
i=1 (i,j)∈E)
import cvxpy
lam = 35.0
u_corr = plt.imread("lenad1.jpg")
U = cvxpy.Variable(shape=(rows, cols))
prob = cvxpy.Problem(obj)
prob.solve(verbose=True, solver=cvxpy.SCS)
plt.imshow(U.value, cmap='gray')
plt.imsave(lena4.jpg', U.value, cmap='gray')
9
[1] Mordvintsev, ROF and TV-L1 denoising with Primal-Dual algorithm, https://
github.com/znah/notebooks/blob/master/TV_denoise.ipynb
[2] Chambolle, An introduction to continuous optimization for imaging, https://
hal.archives-ouvertes.fr/hal-01346507/document
[3] Afonso, Fast Image Recovery Using Variable Splitting and Constrained Optimiza-
tion, http://www.lx.it.pt/˜mtf/Afonso_BioucasDias_Figueiredo_twocolumn_
v7.pdf
[4] Boyd, Additional Exercises for Convex Optimization https://web.stanford.
edu/˜boyd/cvxbook/bv_cvxbook_extra_exercises.pdf
[5] Bayramli, Bilgisayar Bilim, Yapay Zeka, Tensorflow
10
Ağ Akış Problemleri (Network flow problems)
Daha önce işlediğimiz [3] ağ akış konusunu biraz daha genişletelim. Sailco adlı
hayali bir şirket düşünelim, bu şirket yelkenli tekne (sailbot) üretiyor. Problem
şöyle, önümüzdeki 4 ay içinde alttaki üretim sayısını gerçekleştirmesi gerekiyor
(müşteri talebi)
Ay 1 2 3 4
Üretilen tekne sayısı 40 60 70 25
Birinci ayda 40, ikinci ayda 60, vs.. Şirketin bir deposu da var, bitmiş teknelerin
teslim etmeden önce tutuldukları yer burası. 1. ayın başında bu depoda 10
tane tekne var. Her ay kaç tane tekne (ve nasıl) üretileceğini hesaplamam lazım,
burada işçi türü ve depoda olanlar sayıyı etkiler tabii, mesela bir ayda 10 tane
üretmem gerekiyorsa ve depoda zaten 10 tane varsa, hiç üretim yapmama gerek
yok. Ama gelecekte çok fazla üretmem gerektiğini biliyorsam ekstra yapıp onları
depoda tutabilirim, ki sonra gönderebileyim.
İşçi kısıtlaması şöyle, normal işçiyle 400 lira / tekne üzerinden fazla mesai ile 450
lira / tekne üzerinden üretim yapabilirim. Tek bir tekneyi depoda tutmak 20 lira.
Ayrıca normal işçi ile ayda sadece 40 tekne yapabiliyorum, eğer o ayda daha fazla
tekne yapmam gerekiyorsa fazla mesai kullanmam şart.
Problem şöyle, öyle bir üretim ve depolama takvimi planla ki önümüzdeki 4 ay-
daki üretimi minimum masrafla yapabileyim.
Karar değişkenleri neler olacak? Görüyorum ki bu tür problemlerle uğraşan bazı
öğrenciler genelde az sayıda değişken kullanmaya meyilli, mesela “X ayında
üretilecek tekne sayısı” gibi, ve beklenti o ki formüller işin gerisini halletsin.
Yani mesela ilk ay bariz zaten, depoda 10 tane tekne var, geri kalanını ilk ayda
normal işçilere yaptırırım çünkü bu en ucuzu. O zaman o ayda üretilen tekne
sayısı değişkeni yeter, vs. Fakat göreceğiz ki bu tür yaklaşımlar aslında işi daha
zorlaştırıyor. İşimize yaramayabilecek ekstra değişkenler tanımlamak, sonra o
değişkenleri kısıtlayıp probleme uygun şekilde dahil etmek daha kolay.
Biz de böyle yapacağız. Bir sürü değişken; mesela X ayı için kaç tane “normal
işçi teknesi” üretilmesi gerektiği, yani bu sayı sadece normal işçiler tarafından
üretilecek tekneleri kontrol edecek, fazla mesai için farklı olacak.. Her ay de-
poda kaç tekne tutulduğu ayrı sayılacak, her şey bir değişken olacak. Belki bu
değişkenlerden bazıları fuzuli, hatta başka bir şeyi tekrar ediyor sanki, başka
değişkenlerden türetilebilir gibi geliyor, olsun, yine de ekstra değişkeni koyun,
ama diğer yandan aklınızdaki o kuralı probleme sınırlama olarak dahil edin. Lit-
eratürde bu değiskenlere karar değiskenleri deniyor ama aslında onlarin direk
karar verdiğimiz şeyler olmasına gerek yok.
Değişkenler şöyle,
x1 , x2 , x3 , x4 : her ayda normal işçilik ile üretilen tekne sayısı
1
y1 , y2 , y3 , y4 : her ayda fazla mesai ile üretilen tekne sayısı
h1 , h2 , h3 , h4 , h5 : her ay başında depoda olan tekne sayısı. 5 ay var çünkü ay so-
nundaki sayıyı h5 değişkeninde tutuyoruz. Tabii problemi iyi anlayanlarımız
farketmiştir ki bu değişkende sıfır değeri olmalı, tüm tekneler gönderilmiş ol-
malı.
Parametreler
Bunlar değişken değil dikkat, dışarıdan tanımlanan parametreler. Başta gördüğümüz
sayılar bunlar, her ay müşteriden gelen talep,
d1 , d2 , d3 , d4 : her ay için talep (demand).
Kısıtlamalar
0 6 xi 6 40, ki i = 1, 2, 3, 4: normal işçilikle üretilebilecek tekne sayısı, çünkü
üstte belirttik, o tür üretimin sınırı bu
yi > 0: fazla mesai ile üretilebilecek tekne sayısı sınırsız. Tabii ki negatif tekne
üretilemez, o sebeple sıfırdan büyüklük var.
hi + xi + yi = di + hi+1 : teknelerin muhafazası denklemi. Burada diyoruz ki
her ay başında depodaki tekneler artı normal ve fazla mesai işçilik ile ürettiğim
teknelerin toplamı, o aydaki talep ve sonraki aya kalacak depodaki teknelerin
toplamı ile aynı olmalı.
Ayrıca h1 = 10 olduğunu biliyoruz.
Önceki noktayı tekrar vurgulamak gerekirse üstteki h değişkenlerini belki tanımlamam
fuzuli, onları h, d’ler üzerinden de tanımlayabilirdim. Ama bu şekilde yapmak
çok daha açık.
[atlandi]
Bu problemin lineer program olduğunu görebiliyoruz, ama hiçbir ağ akışı filan
göstermedim. O zaman dersimizin başlığı niye ağ akışı? Çünkü bu problemi bir
ağ yapısı içinden akış olarak görmek te oldukça doğal. Ağdaki 1,2,3,4 düğümleri
aylar olacak, ve tekneler o aylar içinden “akıyorlar”, eğer bir ay sonrasında de-
poya bir tekne koyuyorsak sanki o tekne geleceğe doğru gönderiliyor, sonraki
aya veriliyor, o sebeple aylar arasındaki oklar hi .
2
Tabii tüm tekneler bir aydan ötekine akmıyor, müşterilerin (customers) talebine
göre o aydan onlara da belli sayıda tekne “akıyor”, di ile gösterilenler. Her aya
giren akış üretim, R ile gösterilen normal işçilikle, OT ile gösterilen fazla mesai
ile. Bu resimle problemi bir ağ akışı olarak göstermiş olduk.
Daha önce gördüğümüz muhafaza denklemi bu resimde daha bariz hale geldi,
çünkü bu resimle aslında şunu söylüyoruz, her ay düğümüne giren akışlar çıkış
akışlarına eşit olmalı. Bu hem kuvvetli bir ifade ama aynı anda bariz. Düğümler
içinde bir şey tutmamalı, oradan sadece akış var.
Bugün genel olarak göreceğimiz konu minimum bedel akış problemleri olacak,
ki üstteki problem bunun bir örneği. Pek çok optimizasyon problemi yönlü bir
ağ üzerindeki akış olarak görülebiliyor.
Alttaki gibi bir ağ düşünelim,
8 tane düğümü var, bazı kenarları var. Bu ağdaki karar değişkenleri her kenar-
daki akış. Dikkat, karar değişkeni düğümde değil, kenarda. Bulmak istediğimiz
bu akış çünkü, bilahere karar değişkenleri. Bu kenarların her birinde ne kadar
akış var?
Her kenardaki akışın bir bedeli olabilir, ayrıca her kenarın bir kapasite sınırlaması
olabilir (bedeli ne olursa olsun üzerine çıkılamayacak bir eşik değeri). Bedel
örneği olarak mesela bir kenar 2 lira/birimlik olabilir diğeri 10 lira/birim be-
delinde olabilir. O zaman ilk kenardan 5 birim göndermek istersem bunun bana
bedeli 10 lira ikincisinden gondermek istersem 50 lira olacak. Her kenarın akış
bedeli, kapasitesi bizim dışarıdan bir parametre ile tanımladığımız bir şey olacak
tabii ki. Kapasitenin illa sınırlanmış olması gerekmez, sınırsız da olabilir.
Her düğüm bir akış kaynağı (source) da olabilir, yani akışı kendi içinden “doğuruyor”
olabilir. Bazı düğümler akışı yutuyor olabilir, onlara akış gelir ve yokolur, bu
düğümlere alıcı (sink) diyebiliriz. O zaman önceki gördüğümüz sadece aktarıcı
düğümlere ek olarak bu iki tip düğümü de kullanabiliriz. Üstteki resimde en sol-
daki iki düğüm kaynak gibi duruyor, oradan sadece çıkan akış görüyoruz. En
sağdaki ise alıcı, ona akış sadece giriyor.
Optimizasyon probleminin sorduğu soru şu olacak, “en minimum bedelli akış
hangisi?”. Pek çok türlü akış olabilir, bizim aradığımız bedeli en az olan. Bugün
göreceğimiz tüm problemler birer minimum bedelli akış problemi olarak formülize
edilebilir. İlk önce en başta gördüğümüz problemi ağ yapısına tercüme edeceğiz,
sonra diğer göreceğimiz problemlerin birer LP olup olmadığına bakacağız.
Düğümleri numaralandıralım,
3
Her akışı, karar değişkenini xij olarak gösterebiliriz, ki (i, j) ∈ ε, 1’den 3’e akış
x13 olacak. Akış bedeli cij . Toplam bedel her akış çarpı o akışın bedeli toplanmış
hali. Kapasite sınırları pij 6 xij 6 qij ile gösterilebilir, her kenarın bir alt bir de
üst sınırı olabilir (pij çoğu problem için sıfırdır). Muhafaza denklemi, her düğüm
k için [1, 26:22]
X X
xkj − xik = bk , ∀k ∈ N
j∈N i∈N
Toplam bedel
X
cij xij
(i,j)∈ε
X
min cij xij öyle ki
xij ∈R
(i,j)∈ε
X X
xkj − xik = bk , ∀k ∈ N
j∈N i∈N
4
Matrise A sembolü verilir çoğunlukla ve ona oluş, geliş (incidence) matrisi denir.
Örnek olarak sonuncu satıra bakalım, bu satır 8’inci düğüme olanları gösteriyor,
−x68 − x78 hesabı var, eksi işareti düğüme giriş göstergesi, ve sonuç b8 ’e eşit.
A’da sadece 0, -1 ve +1 değerleri vardır ve eldeki düğüm kadar satırı vardır, ve
eldeki kenar kadar kolonu vardır. Dikkat geliş matrisi sadece ağ yapısını kodlar,
kenarlardan giden akış miktarı hala xij değerlerinin kendisinde.
Eğer gereken yerde vektörler de kullanırsak en öz haliyle model şöyle,
min cT x, öyle ki
x∈R|ε|
Ax = b
p6x6q
1T Ax = 1T b = 0
X
bi = 0
i∈N
olmalı. Demek ki tüm arz tüm talebe eşit olacak. O zaman size b’sı sıfıra toplan-
mayan bir minimum bedel akış problemi verirsem bu problem olurlu olmaya-
caktır. Toplam sıfır ise bu probleme “dengeli problem” deniyor. Tabii dengeli
5
bir modelin de illa olurlu olması şart değil, mesela öyle kapasite sınırlamaları ge-
tirebilirsiniz ki olurluluk mümkün olmaz, ama denge yoksa problem kesinlikle
olurlu değildir.
Ama bazen dengesiz problemleri de ufak değişiklikler ile çözmek mümkün oluyor,
mesela bazı =’leri 6 yaparak, ki bunun karşılığı ağa bir kukla (dummy) düğüm
eklemek olabilir .. Ya da pay bırakma (slack) değişkenleri ekleyip bazı eşitsizlikleri
eşitlikge çevirerek..
Örnek Alanlar
Ne kadar çok problemin minimum akış problemi olabildiği şaşırtıcı olabilir.
Nakliyat
Hedef belli bir mali birkaç kaynak noktasından farklı varış noktalarına ulaştırmak.
Kaynaklar bir sürü depo, ambar olabilir, varış noktası farklı müşteriler olabilir,
ürünlerin depodan müşterilere gitmesi gerekiyor. Ama mesela ambar 1’den müşteri
2’ye gönderim olabilir, ya da ambar 4’ten aynı müşteriye.. ? Karar verilmesi
gerekiyor, her müşterinin kendine göre talebi var, her nakliyat yolunun farklı be-
deli var, yolların kapasite limitleri var, depoların arz limitleri var, bu problem en
az bedelli talebi tatmin eden nakliyat kararını verecek.
Örnek şöyle olabilir, Millco’nun (hayali bir şirket) üç tane bakır işleme fabrikası
var, üç tane de maden bölgesi var. Nakliyatın bedeli km başına 2 lira. Madenler
ve fabrikalar arası mesafeler alttaki gibi, o zaman her talebi tatmin edip en az
nakliyat masrafı için hangi nakliyat planı takip edilmeli?
6
Maden Fabrika 1 Fabrika 2 Fabrika 3 Maden başına
günlük
maksimum
kamyon
sevkiyatı
1 8 15 50 20
2 10 17 20 30
3 30 26 15 45
Fabrika talebi 30 35 30
İlk kontrol edebileceğimiz faktör acaba ağ dengeli mi? Tüm arz toplamı tüm talep
toplamı ile aynı mı? Evet. O zaman üstteki çözülebilecek bir problem olabilir.
Düğümleri 1 2 3 A B C olarak düzenleyeyim, kaynaklar bir blok olarak
önce, alıcılar sonra. Geliş matrisi altta [1, 43:55],
Bu tamamen bağlantılı (full connected) bir çiziti temsil ediyor, yani herhangi bir
maden düğümünden herhangi bir fabrika düğümüne gitmenin yolu var. Çözüm
A B C
1 20 0 0
2 10 20 0
3 0 15 30
A = [[ 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1],
[-1, 0, 0, -1, 0, 0, -1, 0, 0],
[0, -1, 0, 0, -1, 0, 0, -1, 0],
[0, 0, -1, 0, 0, -1, 0, 0, -1]]
Bu örnekteki b’de hiç sıfır öğesi yok, niye? Çünkü bu ağ yapısında talep ve arz
tüm düğümlerde tanımlı, yani her düğüm ya bir kaynak ya da alıcı. Böyle ol-
mayabilirdi, arada geçiş düğümleri olsaydı onlar üzerinde muhafaza mantığı se-
bebiyle sıfır tanımı yapmak gerekebilirdi.
Atama (Assignment Problems)
7
Bu tür problemler nakliyat problemine benzer, ama n tane çalışanım n tane yapılacak
işim var. Amaç her n kişiye birer görev vermek. Diyelim ki her çalışanın her
görev için farklı tercihi var, mesela ev işlerinde bulaşık, çöp atmak, duvar boya-
mak için A, B kişileri 1 ile 10 arasında tercih belirtmiş olabilir. Amaç her işi bir
kişiye atamak, öyle ki tüm işler yapılsın aynı anda herkes olabildiği kadar mutlu
olsun.
Bu problem de nakliyat problemi gibi! Ama şimdi akış 1 ya da 0. Her kaynağa 1
giriyor, her alıcıdan 1 çıkıyor. Kenarlar üzerinde hiç kısıtlama yok.
Ama bazılarımız sorabilir, 0.2 insanı bir göreve, 0.8 insani diğerine gönderme gibi
bir sonuç ta istemem, bir tür tam sayı kısıtlaması da olmalı bu problemde, yani
her kenardaki akış ya 0 ya da 1 olmalı. Bu tür kısıtlamaları ileride işleyeceğiz.
Örnek görelim, bir yüzücü antrenörüyüz diyelim, eğittiğimiz 5 yüzücü arasından
bayrak yarışı için seçme yapmamiz gerekiyor. Bayrak yarışında her gidiş gelişte
ardı ardına dört ayrı stil gerekiyor, dört farklı yüzücü bu stillerde yarışabiliyor,
bir gidip geliş sonrası bir yüzücü diğerine bayrağı aktarıyor. Stiller sırtüstü (back-
stroke), kurbağalama (breaststroke), kelebek (butterfly), serbest stil (freestyle).
Her stil bir turda kullanılınca toplam tüm stilleri en çabuk kullanmış olan takım
kazanıyor. Elimizdeki yüzücülerin bu her alandaki geçmişteki zamanlarını biliy-
oruz, bu o yüzücülerin her stildeki kuvvetleri bir bakıma,
Şu mümkün; bir süper yüzücümüz olabilir her stilde en iyi o’dur. Ama bu tek
adamı 4 kez, her stilde kullanamayız, her stil için farklı birini seçmemiz lazım.
Bu iyi yüzücüyü tabii ki bir stil için kullanmak isteriz, ama hangisi için? Optimal
sonuç için bir dengeleme yapmak lazım.
Bu bir atama / görevlendirme problemi işte, her yüzüş stilini birine “atıyorum”.
Bu arada elimizde 4 stil ama 5 yüzücü var, yani bir yüzücü görevsiz kalacak. Bir
kısıtlama var, o da bir yüzücü birden fazla stilde yarışamaz.
Üstteki resimde kırmızı renk yapılan tercihi belirtiyor [1, 54:08].
Bu konu kodlaması hakkında daha fazla detay ekler bölümünde.
Aktarmalı gemi nakliyatı
Bu tür nakliyat problemlerinde bir mali kaynaktan alıcıya direk göndermeye ek
olarak arada bir depoda da tutmamız mümkün, bu durum tabii ki lojistik planla-
mada değişiklikler getirebilir. Amazon gibi şirketler bunu sürekli yapıyor mesela,
bir ürünü önce büyük bir antrepoya gönderiyorlar, oradan başka bir yere aktarma
8
yapıyorlar.
Orta kısımda sarımsı renkle görülen aktarma noktaları. Normal aktarma prob-
lemlerinde olduğu gibi kaynak, alıcı var, arz ve talep sınırları var, kenarlarda
sınırlar olabilir, aktarma noktaları için giren ve çıkan birbirini dengelemeli, yani
muhafaza denklemi onlar için geçerli [1, 56:00]. Aslında başta gördüğümüz Sailco
problemi bir aktarmalı nakliyat problemi.. Depo var, üretici, alıcı var..
En kısa / en uzun yol problemleri
En kısa yol problemleri de minimum bedel akış problemleridir. Size alttaki gibi
bir çizit veriyorum mesela, her kenar, “yol” uzunluğu / zorluğu / bedeli çizitte
veriliyor ve mavi düğümden kırmızı düğüme en kısa bedelle, en kısa şekilde
ulaşmak istiyorum. Bu problemi minimum bedel akış olarak çözmek için elim-
izde sadece tek birimlik akış olduğunu hayal edebiliriz.
Yani mavi düğümün tek birimlik arzı var, kırmızı düğümün tek birimlik talebi
var, ve geri kalan her düğüm aktarıcı, yani girişi, çıkışı muhafaza etmesi gerekiyor.
Kenarların bedeli tabii ki o yolun uzunluğu, kısalığı olarak yorumlanabilir. O
zaman, bu akış problemini çözünce, elde ettiğim akış bana hangi yolun en kısa
olduğunu söyleyecektir. Tabii 1 birimlik arzın bölünüp farklı yönlere gitmesini
istemem ve yine bir tam sayı kısıtlaması gerektiği akla gelebilir. Bu konuya
değineceğiz. Fakat bu problemi bir LP olarak çözünce tam sayı kısıtlaması ol-
masa bile 1/0 bazlı sonuçlar alıyorsunuz. Sihirli bir şey sanki.
[uzun yol atlandi]
9
Maksimum flow problemi de olabilirdi, bir çizit alalım mesela,
Bu çizitteki kenarları kapasite olarak görebiliriz, yani her kenardan ne kadar akış
olabileceği hakkında bir sınır var, mesela üstteki bir su boru hattı ağı olsaydı, her
kenar bir boru olabilirdi ve bu boruların çapına göre, kimisi küçük kimisi büyük,
o borudan ne kadar şu pompalayabileceğimizle alakalı bir kısıtlama var. Amaçım
mavi düğümden kırmızı düğüme mümkün olduğunca fazla şu pompalamak.
Peki çıplak gözle bakınca en fazla ne kadar akış gönderebileceğimizi görebilir
miyiz? Evet. Alıcıya bakarsak en fazla 1+2=3 alabilir, o zaman 3’ten fazla göndermeyiz.
Bu 3 nasıl gönderilecek? 2 hattından 1, 3 hattından 2 birimle belki.. Dikkat bu
problemde yine kaynaktaki akışı bölebiliyoruz.
[maks akışı min akışa çeviren numara atlandı]
Tam sayı çözümleri
Nihayet “sonra değineceğiz” dediğimiz konuya geldik [1, 1:09:21]. Atama prob-
lemi, en kısa yol gibi problemlerde tam sayı sonuçlara ihtiyacımız vardı. Tam sayı
kısıtlama getirmeden tam sayı sonuç elde etmenin bir yolu var. Yani normal bir
LP çözüyorsunuz ve tam sayı bazlı sonuçlar elde ediyorsunuz. Bu nasıl oluyor?
Anlatmadan önce biraz lineer cebire dalmak gerekiyor.
Tanım
Bir matris A tamamen tekbirimseldir (totally unimodular -TU-) eğer A’nin her
mümkün kare altmatrisinin determinantı 0, 1 ya da -1 ise. Hatırlarsak deter-
minantlar kare matrisler üzerinde hesaplanan şeyler, burada tüm karesel altma-
trislerden bahsediyoruz, ve onların determinanti belirttiğimiz gibi ise matris TU
diyoruz.
Aslında TU’luğun kontrolü biraz çetrefil olabilir, düşünürsek bir matris ne kadar
buyurse o kadar mümkün altmatrisi olur. Ama bir matris tamamen 0,1,-1 öğelerinden
10
oluşuyorsa bu kontrol belki daha kolay olur..?
Alttaki matrislerde mesela soldaki TU, ama sağdaki değil.
1 1 0 1 1 1
,
−1 0 1 −1 0 1
Tamam. Şimdi bir teori daha göreceğiz, resim iyice ortaya çıkacak.
Teori
Eğer bir matris A TU ise ve b bir tam sayı vektör ise, o zaman {x : Ax 6 b}
çözümündeki x tam sayı kordinatlarında olacaktır. Yani üstteki şartlar yerindeyse
Ax 6 b çokyüzlüsünün (polyhedron) tüm köşeleri tam sayı noktalarındadır. Bu
teoriyi ispatsız veriyoruz. Ve, bir LP için eğer elimizde tüm köşeleri tam sayı
kordinatlar olan bir çokyüzlü var ise, o LP’nin çözümünün tam sayılar olacağını
biliyoruz.
O zaman, eğer elimde matris A’sı tamamen tekbirimsel olan bir LP var ise, o
zaman tam sayı çözümler elde etmem garanti, tabii b de tamamen tam sayılar
içeriyorsa.
Ve nihai zirveye geldik: tüm geliş matrisleri tamamen tekbirimseldir.
Yani bir ağ akış problemindeki geliş matrisi tamamen tekbirimsel. Ayrıca eğer o
problemin b vektörü de tam sayı ise sonuç muhakkak tam sayılar içerecek.
Bu çok önemli bir sonuç.
O zaman bir minimum bedel akış problemindeki arzlar tam sayı ise, talepler tam
sayı ise, ve tam sayı kenar kapasiteleri içeriyorsa, bu bir minimum bedel tam sayı
akışıdır.
Ekler
Kısayol problemine örnek olarak [2]’deki probleme bakalım.
Başlangıç 's’den bitiş x’e en kısa yol hangisi? Düğümlere s = 1,t = 2,y = 3,x =
4,z = 5 olarak birer indis verelim, ve x = [x12 , x13 , x23 , x24 , x32 , x34 , x35 , x45 , x51 , x54 ]
11
vektörünü tanımlayalım. Geliş matrisini ağdaki bağlantılara göre yapıp çözersek,
A = [
[ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[ -1, 1, 1, -1, 0, 0, 0, 0, 0, 0],
[ 0, -1, -1, 0, 1, 1, 0, 0, 0, 0],
[ 0, 0, 0, -1, 0, -1, 0, 1, 0, -1],
[ 0, 0, 0, 0, 0, 0, -1, -1, 1, 1]]
c= [10, 5, 2, 1, 3, 9, 2, 4, 7, 6]
A = np.array(A); b = np.array(b); c = np.array(c)
[0. 1. 0. 1. 1. 0. 0. 0. 0. 0.]
Sonuçta x13 , x24 , x32 kenarlarının 1 değerini aldığını görüyoruz, bu yollar en kısa
yolun parçalarıdır, demek ki 1-3, 3-2, ve 2-4 yolu en kısa yoldur. Orijinal prob-
lem çözümünde [2] sonucun [’s’, ’y’, ’t’, ’x’] olduğunu görmüştük. Yani aynı
sonuca varmış olduk. Dijkstra algoritmasının bir ayrıksal algoritma olduğunu
unutmayalım, ama üstteki LP bazlı yaklaşım sürekli (continuous) alanda opti-
mizasyon araçları ile aynı sonuca varıyor!
Yüzücüler
Daha önceki problemi yazılımla çözelim. Atama problemleri aslında oldukca
standart, çünkü iş-işçi ağ yapısı hep aynı, arada aktarma olmayan bir ağ yapısı.
Bu yapıyı n tane iş n tane işçi için mekanik bir şekilde yaratabiliyoruz. Bu sebe-
ple çözüm yapan linear_sum_assignment çağrısı sadece bir bedel matrisi alıyor,
gerisini kendi hallediyor.
Bir pürüz nokta, elde işten fazla işçi varsa, mesela yüzme örneğinde olduğu gibi,
5 tane yüzücü, 4 tane stil varsa ortaya çıkar. O zaman numara şudur, bedel matri-
sine bir ’boş stil’ satırı ekleriz [4, sf. 40], oradaki tüm bedeller sıfır olur, yani diğer
işler için optimal olmayan bir kişiyi buraya atamak için algoritmayi yönlendirmiş
oluruz bir bakıma ve yine problemi standart bir şekilde çözeriz.
12
print (raw)
row_ind, col_ind = linear_sum_assignment(raw)
print (col_ind)
print (row_ind)
print (raw[row_ind, col_ind].sum())
1 1 0 0
0 0 1 1
−1 0 −1 0
0 −1 0 −1
olurdu, tabii ki b = [1, 1, −1, −1]. Üstteki matriste kalıp belli oluyor herhalde,
satırların müşteri kısmında her ürün başına tamamen birler var, ürünler kısmında
blok blok yanyana birim matrisleri.. Üstteki matrisi ötomatik olarak yaratmak
mümkün. Hatta şimdi Lineer Programlar, Örnekler yazısındaki problemi ağ mantığı
çözelim,
C = [[17,10,12],[9,8,10], [14,4,7]]
C = np.array(C)
print (C)
n = 3
X = np.zeros((2*n,n**2))
X[0,0:n] = np.ones((1,n))
X[1,n:n+n] = np.ones((1,n))
X[2,2*n:2*n+n] = np.ones((1,n))
X[3:6,0:3] = -np.eye(n,n)
X[3:6,3:6] = -np.eye(n,n)
X[3:6,6:9] = -np.eye(n,n)
print (X)
13
b = [1, 1, 1, -1, -1, -1]
[[17 10 12]
[ 9 8 10]
[14 4 7]]
[[ 1. 1. 1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[-1. -0. -0. -1. -0. -0. -1. -0. -0.]
[-0. -1. -0. -0. -1. -0. -0. -1. -0.]
[-0. -0. -1. -0. -0. -1. -0. -0. -1.]]
[0. 0. 1. 1. 0. 0. 0. 1. 0.]
Aynı sonuca eriştiğimizi görüyoruz. Not: hem üstteki geliş matrisi hem de diğer
LP yazısındaki problemin tamamen tekbirimsel olduğuna dikkat, bu sebeple her
iki problem de tamsayı çözümü veriyor.
5 yüzücü için ve yine sıfırlı satırı ekleyip, yüzücü problemini de aynı şekilde
çözebilirdik.
Kaynaklar
[1] Lessard, Introduction to Optimization, CS/ECE/ISyE 524, Lecture 5, University of
Wisconsin-Madison, https://laurentlessard.com/teaching/524-intro-
to-optimization
[2] Bayramli, Bilgisayar Bilim, Dijkstra Algoritması ile En Kısa Yol
[3] Bayramli, Fonksiyonel Analiz ve Optimizasyon, Çifteşlik, İkizlik (Duality)
14
Yükseklik Fonksiyonu (Tepeler) Arasından En Düz, Optimal Yürüyüş Yolunu
Bulmak
Elimizde bir alan içindeki yükseklikleri veren bir fonksiyon f(x, y) olduğunu
düşünelim. Acaba verili bir başlangıç ve bitiş noktası arasındaki en “rahat” gidiş
yolunu nasıl buluruz?
Yükseklikler bir E(x, y) fonksiyonunda olsun. Yolları nasıl temsil ederiz? Bir
parametrik eğri kullanabiliriz, mesela
x(t) = a0 + a1 t + a2 t2 + a3 t3
y(t) = b0 + b1 t + b2 t2 + b3 t3
def plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4):
D = 50
x = np.linspace(0,5,D)
1
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)
t = np.linspace(0,1.0,100)
ax.plot3D(x, y, gfunc(x,y),'r.')
plt.savefig('calc_multi_40_elev_01.png')
Eğer üstteki gidiş yoluna kuşbakışı, iki boyutlu ortamda bakmak istersek,
t = np.linspace(0,1.0,100)
x = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4
y = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4
plt.xlim(0,5.0)
plt.ylim(0,5.0)
plt.plot(x,y)
plt.savefig('calc_multi_40_elev_02.png')
2
Bu biraz önce bahsettiğimiz yatay düzlemdeki yansıma.
Şimdi ikinci bir gidiş yoluna bakalım, başlangıç noktası aynı ama bitiş farklı,
3
Z t=1
s 2
dz
Iv = 1+ dt
t=0 dt
Z t=1
s 2 2
dx dy
Ih = + dt
t=0 dt dt
Formülde görülen dz/ dt, dx/ dt ve dy/ dt, parametrik eğri üzerinden alınacak
tabii ki. Problem çözümü açısından dz/ dt hesabı külfetli olabilir, çünkü z =
f(x, y) yükşelik fonksiyonundur. Üstteki örnekteki yükseklik fonksiyonu basit,
ama daha çetrefil durumlarda da kullanabileceğimiz bir yaklaşım daha iyi olur.
Bu sebeple dz/ dt türevini hesapsal yapacağız.
Ama yatay türevler dx/ dt ve dy/ dt için, türevi almak, kare, toplam, karekök
hesaplarını sembolik olarak yapabiliriz, çünkü bu formül polinom, formu şimdiden
belli.
import sympy
dxdt = sympy.diff(xdef,t)
print (dxdt)
dydt = sympy.diff(ydef,t)
print (dydt)
sqrtdef = sympy.sqrt(sympy.diff(xdef,t)**2 + sympy.diff(ydef,t))
print (sqrtdef)
4
def trapz(y, dx):
vals = y[1:-1]
vals = vals[vals>0.0]
return (y[0]+np.sum(vals*2.0)+y[-1])*(dx/2.0)
def find_path(ex,ey,a0,b0):
def calc_int(pars):
a1,a2,a3,b1,b2,b3=pars
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
def gfunc(t):
t = t[0]
x = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4
y = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4
s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
return g1*10.0
ts = np.linspace(0.0,1.0,100)
dzs = np.array([util._approx_fprime_helper([t],gfunc)[0] for t in ts])
tmp = np.sqrt(1.0+(dzs**2.0))
Iv = trapz(tmp, 1/100.)
tmp = np.array([b1 + 2*b2*t + 3*b3*t**2 - 112.0*t**3 + (a1 + 2*a2*t + 3*a3*t**
tmp = tmp[tmp>0.0]
tmp = np.sqrt(tmp)
Ih = trapz(tmp, 1/100.)
res = Iv*5 + Ih*1
return res
LIM = 5.0
# rasgele secilmis baslangic degerleri
a1,a2,a3 = 0,0,0
b1,b2,b3 = 0,0,0
x0 = a1,a2,a3,b1,b2,b3
return res
a0,b0=(1.0,1.0)
ex,ey=(0.3,4.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])
a0,b0=(4.0,1.0)
5
ex,ey=(1.0,4.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])
6
Yol oldukca optimal duruyor. Gereksiz iniş çıkış yok, ve yatay mesafe de mini-
mize edilmiş.
İkinci örnek
a0,b0=(4.0,1.0)
ex,ey=(1.0,4.0)
a1,a2,a3,b1,b2,b3 = -0.3061632, 4.76223126, 4.99872105, 0.41013189, 4.9713953,
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plt.savefig('calc_multi_40_elev_05.png')
7
x = b0 + b1 σ(t, v1 ) + b2 σ(t, v2 ) + ...
1
σ(x, k) = (x − k)
1 + exp(−α(x − k))
1
σ(x) =
1 + exp(−αx)
rho = 7.0
def sig(x,a):
return (x-a)*1/(1+np.exp(-rho*(x-a)))
def plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3):
D = 50
x = np.linspace(0,5,D)
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)
t = np.linspace(0,5.0,100)
8
def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x
def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y
def find_path(ex,ey,a0,b0):
def calc_int(pars):
a1,a2,a3,b1,b2,b3=pars
def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x
def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y
def gfunc(t):
t = t[0]
x = sigx([t])
y = sigy([t])
s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
s2 = 1.2; x2 = 4.0; y2 = 1.0
g2 = np.exp( -4 *np.log(2) * ((x-x2)**2+(y-y2)**2) / s2**2)
return g1*10.0 + g2*10.0
ts = np.linspace(0.0,5.0,100)
dzs = np.array([util._approx_fprime_helper([t],gfunc)[0] for t in ts])
9
tmp = np.sqrt(1.0+(dzs**2.0))
Iv = trapz(tmp, 5./100)
dxs = np.array([util._approx_fprime_helper([t],sigx)[0] for t in ts])
dys = np.array([util._approx_fprime_helper([t],sigy)[0] for t in ts])
tmp = np.power(dxs,2) + np.power(dys,2)
tmp = tmp[tmp>0.0]
tmp = np.sqrt(tmp)
Ih = trapz(tmp, 5./100)
res = Iv*5.0 + Ih*1.0
#print (res)
return res
LIM = 2.0
def conx(x):
aa1,aa2,aa3,bb1,bb2,bb3 = x
a = a0+aa1*(5.0-1.0)+aa2*(5.0-2.0)+aa3*(5.0-3.0)-ex
return a
def cony(x):
aa1,aa2,aa3,bb1,bb2,bb3 = x
b = b0+bb1*(5.0-1.0)+bb2*(5.0-2.0)+bb3*(5.0-3.0)-ey
return b
return res
a0,b0=(1.0,1.0)
ex,ey=(4.0,2.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])
Sonuc
0.54188089 0.15991385 0.17636745 -0.20027426 0.26754927 0.4992246
import pandas as pd
import numpy as np
10
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial.distance import cdist
from matplotlib import cm
rho = 7.0
def sig(x,a):
return (x-a)*1/(1+np.exp(-rho*(x-a)))
def plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3):
D = 50
x = np.linspace(0,5,D)
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)
t = np.linspace(0,5.0,100)
def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x
def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y
ax.view_init(elev=45, azim=-113)
ax.plot3D(xs, ys, gfunc(xs,ys),'r.')
11
a1,a2,a3,b1,b2,b3=0.54187919, 0.15991569, 0.17636809, -0.20027283, 0.26755009, 0.4
a0,b0=(1.0,1.0)
plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3)
#plt.show()
plt.savefig('calc_multi_40_elev_06.png')
# -113,45
Sadece 3 tane ilmik noktası tanımladık, bu noktalar vektörel notasyon ile çoğaltılabilir.
Fakat optimizasyon gayet optimal bir yolu bulabildi, bu örnekte iki tane tepe var,
ama onların arasından geçerek sonuca ulaştı.
Bitiş noktalarını cebirsel değil conx ve cony adlı iki sınırlama tabiri ile zorladık.
Polinom bazlı eğride bazı türevleri sembolik olarak almıştık, burada tüm türevler
sayısal bazlı fakat sigmoid bazlı parametrik eğrilerin de sembolik türevini kullan-
mak zor değil. Burada hızlı kodlama amaçlı bunu yapmadık.
Kaynaklar
[1] Bayramlı, Sayısal Bilim, Sayısal Entegrasyon (Numerical Integration)
[2] Bayramlı, Çok Boyutlu Calculus, Ders 6, Eğri Uzunluğu
[3] Bayramlı, Çok Boyutlu Calculus, Ders 5, İki Nokta Arasında Parametrize Edilmiş
Eğri
[4] Bayramlı, İstatistik ve Veri Analizi, Dairesel Baz Fonksiyonları (Radial Basis Func-
tions -RBF-)
[5] Bayramlı, Fonksiyonel Analiz ve Optimizasyon, Newton-umsu Metotlar, DFP,
BFGS
12
Ekler
Yunan Harfleri